1260: [CQOI2007]涂色paint

Time Limit: 30 Sec  Memory Limit: 64 MB
Submit: 2057  Solved: 1267
[Submit][Status][Discuss]

Description

假设你有一条长度为5的木版,初始时没有涂过任何颜色。你希望把它的5个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为5的字符串表示这个目标:RGBGR。
每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标。
用尽量少的涂色次数达到目标。

Input

输入仅一行,包含一个长度为n的字符串,即涂色目标。字符串中的每个字符都是一个大写字母,不同的字母代表不同颜色,相同的字母代表相同颜色。

Output

仅一行,包含一个数,即最少的涂色次数。

Sample Input

 

Sample Output

【样例输入1】
AAAAA

【样例输入1】
RGBGR

【样例输出1】
1

【样例输出1】
3

HINT

40%的数据满足:1<=n<=10
100%的数据满足:1<=n<=50


题解

一道区间dp。

设F[L][R]为把[L,R]画完所需的最少次数。初始化F[i][j]=(j-i+1),表示暴力的一格格涂。

转移时,在[L,R]上枚举两个断点(L',R'),表示在[L,R]上直接覆盖一个区间[L',R']。

一开始让F[L][R]=F[L][L'-1]+F[L'][R']+F[R'+1][R],表示把大区间视为三个小区间,不在乎他们边界可能有缘。

  1. 如果L'上的颜色和L'-1相同,那么可以少画一次;
  2. 如果R'上的颜色和R'+1相同,那么可以少画一次;
  3. 如果L'-1上的颜色和R'+1上相同,那么又可以少画一次。

最后注意一下,因为假设在[L,R]上涂一层时,就算证明了这一层完全融入背景色,也不可能给原区间一个-1的buff,所以最多只能少画两次。

答案在F[1][n]。

我现在在怀疑是不是只用一个断点就可以解决问题

/**************************************************************
Problem: 1260
User: qwerta
Language: C++
Result: Accepted
Time:76 ms
Memory:1300 kb
****************************************************************/ #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char s[];
int f[][];
int chek(int i,int j)
{
if(s[i]==s[j])return ;//相同就可以少画一笔
else return ;
}
int main()
{
//freopen("a.in","r",stdin);
cin>>s;
int n=strlen(s);
for(int i=n;i;--i)
s[i]=s[i-];
for(int i=;i<=n;++i)
for(int j=i;j<=n;++j)
f[i][j]=(j-i+);//预处理
for(int len=;len<=n;++len)
for(int l=,r=len;r<=n;++l,++r)
{
for(int ll=l;ll<=r;++ll)
for(int rr=ll;rr<=r;++rr)
{
int k=f[l][ll-]+f[rr+][r]+f[ll][rr],g=;
if(ll->=l)g+=chek(ll-,ll);//左边界融入背景(///v///)
if(rr+<=r)g+=chek(rr,rr+);//右边界融入背景(///v///)
if(ll->=l&&rr+<=r)g+=chek(ll-,rr+);//左右边界是一样哒!(>w<)
k-=min(g,);//最多只能少画两笔QAQ
f[l][r]=min(f[l][r],k);
}
}
cout<<f[][n];
return ;
}

「CQOI2007」「BZOJ1260」涂色paint (区间dp的更多相关文章

  1. 【BZOJ-1260】涂色paint 区间DP

    1260: [CQOI2007]涂色paint Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 1147  Solved: 698[Submit][Sta ...

  2. [BZOJ1260][CQOI2007]涂色paint 区间dp

    1260: [CQOI2007]涂色paint Time Limit: 30 Sec  Memory Limit: 64 MB Submit: 1575  Solved: 955 [Submit][S ...

  3. BZOJ 1260: [CQOI2007]涂色paint( 区间dp )

    区间dp.. dp( l , r ) 表示让 [ l , r ] 这个区间都变成目标颜色的最少涂色次数. 考虑转移 : l == r 则 dp( l , r ) = 1 ( 显然 ) s[ l ] = ...

  4. 【bzoj1260】[CQOI2007]涂色paint 区间dp

    题目描述 给出一个序列,每次可以给一段染成同一种颜色,问最少要染多少次能够染成给定方案. 输入 输入仅一行,包含一个长度为n的字符串,即涂色目标.字符串中的每个字符都是一个大写字母,不同的字母代表不同 ...

  5. B1260 [CQOI2007]涂色paint 区间dp

    这个题和我一开始想的区别不是很大,但是要我独自做出来还是有一些难度. 每一次涂色 只有这两种可能: 1) 把一段未被 覆盖过的区间 涂成 * 色 2) 把一段被一种颜色覆盖的区间涂成 * 色 (并且 ...

  6. CQOI2007 涂色 paint (区间dp)

    听说这道题是当年省选题 于是兴致勃勃拿来做了做 至于如何想到思路... 事实上没想象中那么简单... 脑阔挺疼的... (一开始都没看出来是区间dp) 想到可以区间dp,然后就似乎没啥大问题 枚举区间 ...

  7. 【bzoj1260】涂色paint[CQOI2007](区间dp)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1260 这道题其实和codeforces607B有点像,然而做过原题的我居然没看出来.. ...

  8. 1260. [CQOI2007]涂色【区间DP】

    Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符串表示这个目标:RGBGR. 每次你可以把一段连续 ...

  9. BZOJ1260 CQOI2007 涂色paint 【区间DP】

    BZOJ1260 CQOI2007 涂色paint Description 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字 ...

随机推荐

  1. CapIp.pas

    unit CapIp; interface uses Windows, Messages,Classes,winsock,sysutils; const WM_CapIp = WM_USER + ; ...

  2. 百科知识 .e,.ec文件如何打开

    1 .e是易语言源文件,你可以从以下网址下载e语言编程环境: http://www.xiazaiba.com/html/409.html   2 安装之后会自动关联.e文件.   3 打开一个e语言文 ...

  3. C#.NET的TabControl如何隐藏和显示页面

    如果需要显示某个页面,则让他的Parent就是TabControl的控件名称,如果要隐藏,则等于null      private void ToolStripMenuItemTeachPanelBa ...

  4. java性能监控工具jconsole-windows

    jconsole Starts a graphical console that lets you monitor and manage Java applications. Synopsis jco ...

  5. 自己写的通过ADO操作mysql数据库

    #include <iostream> #include <windows.h> #include <atlstr.h> #import "c:\Prog ...

  6. Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.1

    Spark MLlib Deep Learning Deep Belief Network (深度学习-深度信念网络)2.1 http://blog.csdn.net/sunbow0 Spark ML ...

  7. PADS的历史版本

    1986年:PADS PCB,DOS操作系统 1989年:PADS Logic,DOS操作系统 1990年:PADS 2000,DOS操作系统 1993年:PADS Perform,DOS和Windo ...

  8. tail 监控日志文件

    ail命令可以输出文件的尾部内容,默认情况下它显示文件的最后十行.它常用来动态监视文件的尾部内容的增长情况,比如用来监视日志文件的变化.与tail命令对应的是head命令,用来显示文件头部内容. 常用 ...

  9. linux之return和exit引发的大问题(vfork和fork)

    在coolshell.cn上看到的一个问题.为此拿来研究一下. 首先 看看return和exit的差别 在linux上分别跑一下这个代码 int main() { return 0; //exit(0 ...

  10. 使用Pig对手机上网日志进行分析

    在安装成功Pig的基础上.本文将使用Pig对手机上网日志进行分析,详细过程例如以下: 写在前面: 手机上网日志文件phone_log.txt.文件内容 及 字段说明部分截图例如以下 需求分析 显示每一 ...