【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解
废话不多说,直接上题:
P4170 [CQOI2007]涂色
题目描述
假设你有一条长度为5的木版,初始时没有涂过任何颜色。你希望把它的5个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为5的字符串表示这个目标:RGBGR。
每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标。
用尽量少的涂色次数达到目标。
输入格式
输入仅一行,包含一个长度为n的字符串,即涂色目标。字符串中的每个字符都是一个大写字母,不同的字母代表不同颜色,相同的字母代表相同颜色。
输出格式
仅一行,包含一个数,即最少的涂色次数。
输入输出样例
AAAAA
1
RGBGR
3
说明/提示
40%的数据满足:1<=n<=10
100%的数据满足:1<=n<=50
首先,我们先来看一下样例,就以样例二为例子讲解吧,应该是红、绿、蓝、绿、红的样子,也就是说目标样子是这样的:
那么我们是如何涂的呢?
首先是红色:
然后是绿色:
最后是蓝色:
一共是3次,当然,也有其他涂法,不过都是三次。
那么我们可以先来思考,每次我们刷的是什么?一个区间!显然,答案就是整个区间,像极了区间动态规划,那么我们就使用区间动态规划的思路来解吧。
设计状态自然是不难的,我们用f[i][j]表示i~j区间内变成目标状态刷的次数。
关键所在是状态转移方程,先来思考一个区间左右两端的颜色可能是什么关系?
①相同的:那么就是说我们只要这个区间直接刷上这个颜色,那么其中一个端点就是白刷的,因为没有特地的去刷它,那就不管其中一个点了,那么我们就只要把问题抛给f[i+1][j]和f[i][j-1]就可以了。
②不同的:我们直接把问题抛给f[i][k]+f[k+1][j]就好了。
这样两个状态转移方程就列好了f[i][j]=min(f[i+1][j],f[i][j-1])和f[i][j]=min{f[i][k]+f[k+1][j]}。
直接看代码吧:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int f[1000][1000]; 5 char s[10000]; 6 int main() 7 { 8 cin>>s+1;//从1开始 9 int n=strlen(s+1); 10 memset(f,0x3f3f3f3f,sizeof(f));//赋初始值 11 for(int i=1;i<=n;i++) f[i][i]=1;//给一个地方刷当然是刷一次 12 for(int l=1;l<n;l++)//以下是区间dp模板 13 for(int i=1,j=l+1;j<=n;i++,j++) 14 { 15 if(s[i]==s[j]) //分情况:首尾颜色一样 16 f[i][j]=min(f[i+1][j],f[i][j-1]); 17 else//不一样 18 { 19 for(int k=i;k<j;k++) 20 f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); 21 } 22 } 23 cout<<f[1][n]; 24 return 0; 25 }
转载于:https://www.cnblogs.com/TFLS-gzr/p/11287180.html
【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解相关推荐
- [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)
1260: [CQOI2007]涂色paint Time Limit: 30 Sec Memory Limit: 64 MB Submit: 1681 Solved: 1018 [Submit][ ...
- 【动态规划】P4170 :涂色(区间dp)
初始化: 因为要求 最小值,所有dp初始化为INF 当区间长度为1时,dp为1 枚举时先枚举小区间 #include<iostream> #include<cstring> # ...
- 【算法•日更•第十九期】动态规划:RMQ问题
▎前言 首先先来说一下RMB是什么,当然是人民币啦. 今天我们要学的这个东西不一般,叫做RMQ问题,那么它和RMB有什么关系呢?待小编细细说来. ▎前置技能:动态规划 不会的同志请戳这里迅速了解动态规 ...
- 【算法•日更•第七期】区间动态规划详解+一本通1570能量项链题解
▎前置基础 啥也不用说,不会动态规划绝对看不懂,请不会动态规划的同志们先戳这里了解基础动态规划. ▎什么是区间动态规划? 区间动态规划可以理解为用了分治的动态规划. 顾名思义,动态规划中涉及了区间,那 ...
- 剑指offer python实现_剑指offer系列python实现 日更(三)
今天来讲讲斐波那契数列和它的孩子们~先讲个冷笑话:今天来一盘斐波那契炒饭,它等于昨天的炒饭加上前天的炒饭 7.斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第 ...
- 开发者论坛一周精粹(第三十期) 晒技术关键词逢8有喜 云大使ACP享杭州云栖门票等特权...
开发者论坛每周选取精华内容总结,精选论坛优质贴,每周更新一期,方便大家阅读! 重磅!阿里云开发者论坛晒成绩单逢8有喜,福禄寿淘公仔不限量送了,赶快喊上你的小伙伴来晒2018年的技术关键词吧. 还有,马 ...
- [区间dp]涂色 洛谷P4170
题目描述 假设你有一条长度为 5 的木板,初始时没有涂过任何颜色.你希望把它的 5 个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为 5 的字符串表示这个目标:RGBGR. 每次你可以把一段连续的 ...
- 210807算法日记:文件后缀数据点的生成洛谷数据点的上传
1.常见的文件后缀 后缀名 含义 .exe 可执行程序 .txt 文本文件 .doc/.docx 纯文字文件(word) .zip 压缩包 .jpeg/.jpg 图片 2.数据点的生成 #includ ...
最新文章
- 如何正确克隆JavaScript对象?
- 使用scipy实现简单神经网络
- rabbitMQ教程 一篇文章看懂rabbitMQ
- π!到底蕴藏了多少不为人知的秘密?|今日最佳
- java代码_Java 代码实现排序算法
- NOI提高级:排序算法之归并排序、快速排序
- [Java] 如何学Java
- matlab 过度曝光,MATLAB:补偿图像处理中的过度曝光/过饱和度
- 【Win10 应用开发】实现数据的增量加载
- 推券客微信公众号查询淘宝优惠券返利系统的设置教程
- 网络性能衡量的指标有哪些?
- 使用M0 DesignStart 的样例SoC(example system) - 1 SoC组件
- 软件测试中的Fault、Error和Failure
- 解读6大常见肿瘤的消融选择
- Mendix与JEECG对比
- 网易白帽子黑客训练营笔记(1)
- mysql sql 当前日期拼接某个时间段的写法
- 中国迟来的电信业重组
- 微信小程序——tap undefined Setting data field currType to undefined is invalid.
- 模糊控制理论学习笔记
热门文章
- DELPHI PROTOBUF免费的开源支持库fundamentals5
- smartSVN 分支与合并
- JQuery:JQuery遍历详解
- 负载均衡集群HAProxy讲解篇
- PHP notice/warning 对性能的影响
- 二进制 正数 负数 源码反码补码
- java中使用配置文件_Java中使用Properties配置文件的简单方法
- 搜狗服务器页面找不到了怎么办,处理搜狗浏览器提示“无法解析服务器的DNS地址”的方法...
- c语言中元音字母对应的的值,全国计算机等级考试二级C语言南开上机百题改错题第59...
- python绘图库seaborn_Matplotlib Toolkits:python高级绘图库seaborn