CQOI2007]涂色paint(BZOJ 1260) 区间动态规划 DP 逆向思维
大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn
文章目录
- [CQOI2007]涂色paint(BZOJ 1260)
- 题目描述
- 输入输出格式
- 输入格式:
- 输出格式:
- 分析
[CQOI2007]涂色paint(BZOJ 1260)
题目描述
假设你有一条长度为5的木版,初始时没有涂过任何颜色。你希望把它的5个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为5的字符串表示这个目标:RGBGR。
每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标。
用尽量少的涂色次数达到目标。
输入输出格式
输入格式:
输入仅一行,包含一个长度为n的字符串,即涂色目标。字符串中的每个字符都是一个大写字母,不同的字母代表不同颜色,相同的字母代表相同颜色。
输出格式:
仅一行,包含一个数,即最少的涂色次数。
分析
我们要将一个区间涂成给出的颜色。
这道题的难点在于其与我们的思维相逆。
我们主观上的涂色全部都是先涂底层,然后在逐渐在上面覆盖,而这道题的状态转移方程却不同。
首先状态,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[55];
int dp[55][55];
int main()
{scanf("%s",c+1);int l = strlen(c+1);memset(dp,0x3f,sizeof(dp)); for(int i = 1;i<=l;i++){dp[i][i] = 1;}for(int len = 2;len<=l;len++){for(int i = 1;i+len-1<=l;i++){int j = i+len-1;if(c[i]==c[j]){dp[i][j] = min(dp[i+1][j],dp[i][j-1]);}else{for(int k = i;k<j;k++){dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]);}} }}printf("%d",dp[1][l]);return 0;}
2020年8月13日更
大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn
CQOI2007]涂色paint(BZOJ 1260) 区间动态规划 DP 逆向思维相关推荐
- bzoj 1260: [CQOI2007]涂色paint(区间DP)
1260: [CQOI2007]涂色paint Time Limit: 30 Sec Memory Limit: 64 MB Submit: 1681 Solved: 1018 [Submit][ ...
- [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
(⊙o⊙)-,常规课考试又炸了!目测此次我要完蛋了... 又玩脱了,考数学的时候装B装大了! 算了,先进入正题... 题目描述: Description 假设你有一条长度为5的木版,初始时没有涂过任何 ...
- 【题解】 bzoj1260: [CQOI2007]涂色paint (区间dp)
bzoj1260,懒得复制,戳我戳我 Solution: 这种题目我不会做qwq,太菜了 区间打牌(dp) 用f[l][r]表示从l到r最少需要染几次色. 状态转移方程: 1.\(f[l][r]=mi ...
- [CQOI2007]涂色PAINT
题意: 给你目标字符串的状态,现可以将连续一段字符串染色,求最小的染色次数 题解: 我们定义dp[i][j]是区间i到区间j最小的涂色次数 区间dp的核心思想实际上是由一个个小区间进行合并成为大区间, ...
- 【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解
废话不多说,直接上题: P4170 [CQOI2007]涂色 题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符 ...
- 算法学习 区间dp 涂色PAINT
题目链接: 牛客网 涂色PAINT 这是一道区间dp题,题目有小错误,字符串的长度不是5,而是小于1005的长度. 定义:f[i][j] 为区间[i,j]需要涂色最少的次数 我们可以发现这样一件事:我 ...
- 【每日一题】涂色PAINT
涂色PAINT:区间dp https://ac.nowcoder.com/acm/problem/19909 思路:和取数游戏一样设置dp状态. 设置状态: 表示区间涂[i,j]需要的最少次数. 状态 ...
- 洛谷P4170 [CQOI2007]涂色 题解
洛谷P4170 [CQOI2007]涂色 题解 题目链接:P4170 [CQOI2007]涂色 题意: 假设你有一条长度为 555 的木板,初始时没有涂过任何颜色.你希望把它的 555 个单位长度分别 ...
- 省选专练[CQOI2007]涂色
不好理解的DP 伪区间DP F(i,j)表示子串i-j实现的方式最小 当i=j时明显为1 当s[i]==s[j]时 这里是理解的重难点: 通过递归可知当你刷i的时候顺便刷到j就好了 然后就是标准的区间 ...
最新文章
- 记一次支付系统的设计体验
- SQL 关于地图两个坐标点之间的距离运算
- 姑娘,你为什么要编程?
- 使用 pyinstaller 打包 py 文件成 exe 程序
- 小技巧 ----- Java算法题中的输入输出
- 论一切都是文件之匿名 inode
- Flink 如何读取和写入 Clickhouse?
- 酷睿i7 8750h相当于什么水平 i78750h属于什么级别
- vmd python 命令_VMD常用命令
- puzzle(0131)《迷宫》
- 合作式智能运输系统 应用层交互技术要求 第 1 部分:意图共享与协作
- 为什么空集是集合的子集_空集为什么是任何集合的子集和非任何空集的真子集呢...
- Openwrt编译feeds机制
- 键盘钢琴c语言,键盘钢琴c
- UDP协议、广播、组播和多路复用(网络编程二)
- 论文写作——5 introduction与语言逻辑(以韬韬同学ASMI27版为例)
- 微信小程序底部弹窗(半屏弹窗)---WeUI组件使用
- Python-读取并显示图片
- java语言的编译器命令_Java编译器的命令是( )
- C/C++的就业,发展方向
热门文章
- java连接mysql lookup_Java数据库连接池lookup用法
- 使用DDE传输数据至SQL Server
- Word:一级标题行首段前距失效问题
- 优惠券设计 | 从生成规则到优惠金额分摊
- 纯小白Python爬取东方财富网研报内容并通过机器学习的SVM模型进行文本分析(四)
- uniapp毫秒倒计时
- Codeforces Round #660 (Div. 2) A. Captain Flint and Crew Recruitment
- 支付宝 ACQ.TRADE_NOT_EXIST 解决方案
- 百度、Google 埋点统计(Vue篇)
- 微信小程序如何实现搜索框的防抖功能