[CQOI2007]涂色paint(BZOJ 1260)题解
题目描述
假设你有一条长度为5的木版,初始时没有涂过任何颜色。你希望把它的5个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为5的字符串表示这个目标:RGBGR。
每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标。
用尽量少的涂色次数达到目标。
输入输出格式
输入格式:
输入仅一行,包含一个长度为n的字符串,即涂色目标。字符串中的每个字符都是一个大写字母,不同的字母代表不同颜色,相同的字母代表相同颜色。
输出格式:
仅一行,包含一个数,即最少的涂色次数。
非常明显的一道区间DP
关于区间DP转https://www.cnblogs.com/lizitong/p/10014809.html
我们要将一个区间涂成给出的颜色。
这道题的难点在于其与我们的思维相逆。
我们主观上的涂色全部都是先涂底层,然后在逐渐在上面覆盖,而这道题的状态转移方程却不同。
首先状态,dp[i][j]表示[i]到[j]的最少次数。
注意清初值,由于是求最小,初值清成正无穷,每个单独的颜色都需要涂,所以清成1。
当我们枚举长度的时候,如果[i][j]颜色相同,岂不是我在涂[i][j-1]或者[i+1][j]顺带一笔就可以带过去?
这就是我所说的与我们印象相逆的地方。假设我们现实中一笔带过去,中间的颜色全部会变色,但是我们这里是一个逆向的过程,中间的颜色是建立在已经涂过的颜色基础上的。
仔细想想。
那如果[i][j]颜色不一样呢?
那我们就需要把这段区间分成两段涂,枚举k在区间[i][j]中,把区间分成两段,然后将次数相加。
上代码。欢迎大家在评论区留言讨论。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
char c[];
int dp[][];
int main()
{
scanf("%s",c+);
int l = strlen(c+);
memset(dp,0x3f,sizeof(dp));
for(int i = ;i<=l;i++)
{
dp[i][i] = ;
}
for(int len = ;len<=l;len++)
{
for(int i = ;i+len-<=l;i++)
{
int j = i+len-;
if(c[i]==c[j])
{
dp[i][j] = min(dp[i+][j],dp[i][j-]);
}else
{
for(int k = i;k<j;k++)
{
dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+][j]);
}
}
}
}
printf("%d",dp[][l]);
return ; }
[CQOI2007]涂色paint(BZOJ 1260)题解的更多相关文章
- [BZOJ 1260][CQOI2007]涂色paint 题解(区间DP)
[BZOJ 1260][CQOI2007]涂色paint Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为 ...
- 【DP】BZOJ 1260: [CQOI2007]涂色paint
1260: [CQOI2007]涂色paint Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 893 Solved: 540[Submit][Stat ...
- BZOJ 1260: [CQOI2007]涂色paint( 区间dp )
区间dp.. dp( l , r ) 表示让 [ l , r ] 这个区间都变成目标颜色的最少涂色次数. 考虑转移 : l == r 则 dp( l , r ) = 1 ( 显然 ) s[ l ] = ...
- bzoj千题计划185:bzoj1260: [CQOI2007]涂色paint
http://www.lydsy.com/JudgeOnline/problem.php?id=1260 区间DP模型 dp[l][r] 表示涂完区间[l,r]所需的最少次数 从小到大们枚举区间[l, ...
- [BZOJ1260][CQOI2007]涂色paint 区间dp
1260: [CQOI2007]涂色paint Time Limit: 30 Sec Memory Limit: 64 MB Submit: 1575 Solved: 955 [Submit][S ...
- BZOJ_1260_[CQOI2007]涂色paint _区间DP
BZOJ_1260_[CQOI2007]涂色paint _区间DP 题意: 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字 ...
- BZOJ1260 CQOI2007 涂色paint 【区间DP】
BZOJ1260 CQOI2007 涂色paint Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字 ...
- BZOJ 1260 [CQOI2007]涂色paint(区间DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1260 [题目大意] 假设你有一条长度为n的木版,初始时没有涂过任何颜色 每次你可以把一 ...
- BZOJ 1260: [CQOI2007]涂色paint【区间DP】
Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:RGBGR. 每次你可以把一段连续 ...
随机推荐
- C:\Program不是内部或外部命令,也不是可运行的程序或批处理文件。
问题描述:C:\Program不是内部或外部命令,也不是可运行的程序或批处理文件. 解决办法:C:\"Program Files"\具体文件目录. 具体场景:在cmd或者批处理文件 ...
- docker学习之路-centos下安装docker
前言 我要在云服务器上做一个asp.net core的webapi应用,使用docker来部署应用,中间用到的任何组件包括nginx和sqlserver 2017都是用docker来装载运行,所以,这 ...
- 分布式系统根基:物理时钟和Lamport逻辑时钟
分布式系统解决了传统单体架构的单点问题和性能容量问题,另一方面也带来了很多的问题,其中一个问题就是多节点的时间同步问题:不同机器上的物理时钟难以同步,导致无法区分在分布式系统中多个节点的事件时序.19 ...
- 重温拉格朗日乘子法和KKT条件
在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值:如果含有不等式 ...
- 事件绑定+call apply指向
JS高级 事件—— 浏览器客户端上客户触发的行为都称为事件 所有事件都是天生自带的,不需要我们去绑定,只需要我们去触发,通过obj.事件名=function(){ } 事件名:onmousemove: ...
- React学习笔记②
import React,{Component} from 'react'; import Child from './Child.js' class App extends Component{ c ...
- java OutputStream的使用
package cn.kongxh.io3; import java.io.File ;import java.io.OutputStream ;import java.io.FileOutputSt ...
- 【Python】列表推导式
1. 列表推导式 list1 = [1, 3, 5, 6, 8] list2 = [x * 2 for x in list1] print(list2) # [2, 6, 10, 12, 16]
- document.forms使用
定义:document.forms返回form表单的集合,包含了当前DOM结构中所有的form表单. 语法: . 获取当前DOM结构中的第一个form表单. document.forms[] . 获取 ...
- mysql查看表的属性 mysql将查询结果给临时变量
查看所有的表show table status ; 查看具体的某张表show table status from xxdb like 'tm_properties' ; 查看具体的字段的意思 sele ...