1260: [CQOI2007]涂色paint
Description
Input
Output
Sample Input
Sample Output
AAAAA
【样例输入1】
RGBGR
【样例输出1】
1
【样例输出1】
3
HINT
40%的数据满足:1<=n<=10
100%的数据满足:1<=n<=50
题解:基本思路是枚举区间f[i][j]来表示要正确涂好i——j这个区间最小需要几笔,然后再枚举一个k,将区间分为f[i][k],f[[k+1][j]两部分,f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]。
但是这里有一种特殊情况,因为每个格子都可以反复被涂,所以会有特判,用a[i]来储存第i个格子所需的颜色,如果a[i]=a[j],我们可以在最初选择用一笔就把它们涂好,所以还有个特殊的转移方程:f[i][j]=min(f[i+1][j],f[i][j-1],f[i+1][j-1]+1);
它的意思是有三种选择:1.在涂i+1——j这个区间时,就已经把a[i]涂好了;2.在涂i——j-1这个区间时,就已经把a[j]涂好了;3.在最开始先用一笔把a[i]a[j]涂好,再去考虑里面的。
好了,具体程序里看。
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int j,n,f[][];
string s1;
char s[];
int main()
{
cin>>s1;
n=s1.size();
for (int i=;i<=n;i++) s[i]=s1[i-];
for (int i=;i<=n+;i++)
for (int j=;j<=n+;j++)
if (i==j) f[i][j]=;
else f[i][j]=;
for (int len=;len<=n;len++)
for (int i=;i<=n-len+;i++)
{
j=i+len-;
if (s[i]==s[j]) //特判两端相同情况
{
f[i][j]=min(f[i-][j],f[i][j-]);
if (len==) f[i][j]=;//如果两端相邻,就涂上一笔
else f[i][j]=min(f[i][j],f[i-][j-]+);//否则判断
}
else
{
for (int k=i;k<=j-;k++)
f[i][j]=min(f[i][j],f[i][k]+f[k+][j]);//把区间断开来讨论
}
}
cout<<f[][n]<<endl;
return ;
}
1260: [CQOI2007]涂色paint的更多相关文章
- 【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 1260][CQOI2007]涂色paint 题解(区间DP)
[BZOJ 1260][CQOI2007]涂色paint Description 假设你有一条长度为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. 每次你可以把一段连续 ...
- 【BZOJ】1260 [CQOI2007]涂色paint(区间dp)
题目 传送门:QWQ 分析 区间dp, 详见代码 代码 /************************************************************** Problem: ...
- BZOJ 1260 CQOI2007 涂色paint 动态规划
题目大意:给定一块木板,上面每一个位置有一个颜色,问最少刷几次能达到这个颜色序列 动态规划,能够先去重处理(事实上不是必需),令f[i][j]代表将i開始的j个位置刷成对应颜色序列的最小次数.然后状态 ...
- 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 ...
随机推荐
- XproerIM-v1.3更新-企业即时通迅
版权所有 2009-2016 荆门泽优软件有限公司 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/apps/xproerim/index.a ...
- IOS系列swift语言之课时八
这节课需要讲的就是可选链,内存管理,引用计数,unowned解决 //: Playground - noun: a place where people can play import UIKit / ...
- Android菜鸟成长记13 -- 初识application
二.Application 简介 Application 类是用来维护应用程序全局状态.你可以提供自己的实现,并在 AndroidManifest.xml文件的 <application> ...
- sublime中侧边栏字体大小的设置
sublime这个编辑器相当强大,但是它的侧边栏字体实在是太小了,实在是反人类的设计,幸好它给了我们修改的机会 第一步:下载PackageResourceViewer插件,通过PackageContr ...
- ubuntu源码安装node7+
在官网上下载了node的tar.xz文件(node7.3.0),安装分为两步:1.解压 2.安装 解压也分成两步,首先用xz -d xxx.tar.xz解压为xxx.tar,然后用tar -xvf ...
- [转载] python 计算字符串长度
本文转载自: http://www.sharejs.com/codes/python/4843 python 计算字符串长度,一个中文算两个字符,先转换成utf8,然后通过计算utf8的长度和len函 ...
- bash:fdisk:command not found
bash:fdisk:command not found [lansir@Red-Hat ~]$ fdisk -l-bash: fdisk: command not found 原因是fdisk不在P ...
- js对象使用格式
var initEvent = { list:['editor'], editor:function () { var obj = $("[dataType = 'text']") ...
- Android根据文件路径使用File类获取文件相关信息
Android通过文件路径如何得到文件相关信息,如 文件名称,文件大小,创建时间,文件的相对路径,文件的绝对路径等: 如图: 代码: public class MainActivity extends ...
- 使用Maven自动部署Java Web应用到Tomcat服务器
学习如何使用Maven,我推荐一本工具书,<maven the definitive guide>.在这本工具书手中,详细介绍了maven的使用思想,并且提供了从基本到复杂的具体项目应用. ...