大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!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 逆向思维相关推荐

  1. bzoj 1260: [CQOI2007]涂色paint(区间DP)

    1260: [CQOI2007]涂色paint Time Limit: 30 Sec  Memory Limit: 64 MB Submit: 1681  Solved: 1018 [Submit][ ...

  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

    (⊙o⊙)-,常规课考试又炸了!目测此次我要完蛋了... 又玩脱了,考数学的时候装B装大了! 算了,先进入正题... 题目描述: Description 假设你有一条长度为5的木版,初始时没有涂过任何 ...

  4. 【题解】 bzoj1260: [CQOI2007]涂色paint (区间dp)

    bzoj1260,懒得复制,戳我戳我 Solution: 这种题目我不会做qwq,太菜了 区间打牌(dp) 用f[l][r]表示从l到r最少需要染几次色. 状态转移方程: 1.\(f[l][r]=mi ...

  5. [CQOI2007]涂色PAINT

    题意: 给你目标字符串的状态,现可以将连续一段字符串染色,求最小的染色次数 题解: 我们定义dp[i][j]是区间i到区间j最小的涂色次数 区间dp的核心思想实际上是由一个个小区间进行合并成为大区间, ...

  6. 【算法•日更•第三十期】区间动态规划:洛谷P4170 [CQOI2007]涂色题解

    废话不多说,直接上题:  P4170 [CQOI2007]涂色 题目描述 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂上红.绿.蓝.绿.红色,用一个长度为5的字符 ...

  7. 算法学习 区间dp 涂色PAINT

    题目链接: 牛客网 涂色PAINT 这是一道区间dp题,题目有小错误,字符串的长度不是5,而是小于1005的长度. 定义:f[i][j] 为区间[i,j]需要涂色最少的次数 我们可以发现这样一件事:我 ...

  8. 【每日一题】涂色PAINT

    涂色PAINT:区间dp https://ac.nowcoder.com/acm/problem/19909 思路:和取数游戏一样设置dp状态. 设置状态: 表示区间涂[i,j]需要的最少次数. 状态 ...

  9. 洛谷P4170 [CQOI2007]涂色 题解

    洛谷P4170 [CQOI2007]涂色 题解 题目链接:P4170 [CQOI2007]涂色 题意: 假设你有一条长度为 555 的木板,初始时没有涂过任何颜色.你希望把它的 555 个单位长度分别 ...

  10. 省选专练[CQOI2007]涂色

    不好理解的DP 伪区间DP F(i,j)表示子串i-j实现的方式最小 当i=j时明显为1 当s[i]==s[j]时 这里是理解的重难点: 通过递归可知当你刷i的时候顺便刷到j就好了 然后就是标准的区间 ...

最新文章

  1. 记一次支付系统的设计体验
  2. SQL 关于地图两个坐标点之间的距离运算
  3. 姑娘,你为什么要编程?
  4. 使用 pyinstaller 打包 py 文件成 exe 程序
  5. 小技巧 ----- Java算法题中的输入输出
  6. 论一切都是文件之匿名 inode
  7. Flink 如何读取和写入 Clickhouse?
  8. 酷睿i7 8750h相当于什么水平 i78750h属于什么级别
  9. vmd python 命令_VMD常用命令
  10. puzzle(0131)《迷宫》
  11. 合作式智能运输系统 应用层交互技术要求 第 1 部分:意图共享与协作
  12. 为什么空集是集合的子集_空集为什么是任何集合的子集和非任何空集的真子集呢...
  13. Openwrt编译feeds机制
  14. 键盘钢琴c语言,键盘钢琴c
  15. UDP协议、广播、组播和多路复用(网络编程二)
  16. 论文写作——5 introduction与语言逻辑(以韬韬同学ASMI27版为例)
  17. 微信小程序底部弹窗(半屏弹窗)---WeUI组件使用
  18. Python-读取并显示图片
  19. java语言的编译器命令_Java编译器的命令是( )
  20. C/C++的就业,发展方向

热门文章

  1. java连接mysql lookup_Java数据库连接池lookup用法
  2. 使用DDE传输数据至SQL Server
  3. Word:一级标题行首段前距失效问题
  4. 优惠券设计 | 从生成规则到优惠金额分摊
  5. 纯小白Python爬取东方财富网研报内容并通过机器学习的SVM模型进行文本分析(四)
  6. uniapp毫秒倒计时
  7. Codeforces Round #660 (Div. 2) A. Captain Flint and Crew Recruitment
  8. 支付宝 ACQ.TRADE_NOT_EXIST 解决方案
  9. 百度、Google 埋点统计(Vue篇)
  10. 微信小程序如何实现搜索框的防抖功能