废话不多说,直接上题:


 P4170 [CQOI2007]涂色

题目描述

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

每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标。

用尽量少的涂色次数达到目标。

输入格式

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

输出格式

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

输入输出样例

输入 #1
AAAAA

输出 #1
1

输入 #2
RGBGR

输出 #2
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]涂色题解相关推荐

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

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

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

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

  3. 【动态规划】P4170 :涂色(区间dp)

    初始化: 因为要求 最小值,所有dp初始化为INF 当区间长度为1时,dp为1 枚举时先枚举小区间 #include<iostream> #include<cstring> # ...

  4. 【算法•日更•第十九期】动态规划:RMQ问题

    ▎前言 首先先来说一下RMB是什么,当然是人民币啦. 今天我们要学的这个东西不一般,叫做RMQ问题,那么它和RMB有什么关系呢?待小编细细说来. ▎前置技能:动态规划 不会的同志请戳这里迅速了解动态规 ...

  5. 【算法•日更•第七期】区间动态规划详解+一本通1570能量项链题解

    ▎前置基础 啥也不用说,不会动态规划绝对看不懂,请不会动态规划的同志们先戳这里了解基础动态规划. ▎什么是区间动态规划? 区间动态规划可以理解为用了分治的动态规划. 顾名思义,动态规划中涉及了区间,那 ...

  6. 剑指offer python实现_剑指offer系列python实现 日更(三)

    今天来讲讲斐波那契数列和它的孩子们~先讲个冷笑话:今天来一盘斐波那契炒饭,它等于昨天的炒饭加上前天的炒饭 ‍ 7.斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第 ...

  7. 开发者论坛一周精粹(第三十期) 晒技术关键词逢8有喜 云大使ACP享杭州云栖门票等特权...

    开发者论坛每周选取精华内容总结,精选论坛优质贴,每周更新一期,方便大家阅读! 重磅!阿里云开发者论坛晒成绩单逢8有喜,福禄寿淘公仔不限量送了,赶快喊上你的小伙伴来晒2018年的技术关键词吧. 还有,马 ...

  8. [区间dp]涂色 洛谷P4170

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

  9. 210807算法日记:文件后缀数据点的生成洛谷数据点的上传

    1.常见的文件后缀 后缀名 含义 .exe 可执行程序 .txt 文本文件 .doc/.docx 纯文字文件(word) .zip 压缩包 .jpeg/.jpg 图片 2.数据点的生成 #includ ...

最新文章

  1. 如何正确克隆JavaScript对象?
  2. 使用scipy实现简单神经网络
  3. rabbitMQ教程 一篇文章看懂rabbitMQ
  4. π!到底蕴藏了多少不为人知的秘密?|今日最佳
  5. java代码_Java 代码实现排序算法
  6. NOI提高级:排序算法之归并排序、快速排序
  7. [Java] 如何学Java
  8. matlab 过度曝光,MATLAB:补偿图像处理中的过度曝光/过饱和度
  9. 【Win10 应用开发】实现数据的增量加载
  10. 推券客微信公众号查询淘宝优惠券返利系统的设置教程
  11. 网络性能衡量的指标有哪些?
  12. 使用M0 DesignStart 的样例SoC(example system) - 1 SoC组件
  13. 软件测试中的Fault、Error和Failure
  14. 解读6大常见肿瘤的消融选择
  15. Mendix与JEECG对比
  16. 网易白帽子黑客训练营笔记(1)
  17. mysql sql 当前日期拼接某个时间段的写法
  18. 中国迟来的电信业重组
  19. 微信小程序——tap undefined Setting data field currType to undefined is invalid.
  20. 模糊控制理论学习笔记

热门文章

  1. DELPHI PROTOBUF免费的开源支持库fundamentals5
  2. smartSVN 分支与合并
  3. JQuery:JQuery遍历详解
  4. 负载均衡集群HAProxy讲解篇
  5. PHP notice/warning 对性能的影响
  6. 二进制 正数 负数 源码反码补码
  7. java中使用配置文件_Java中使用Properties配置文件的简单方法
  8. 搜狗服务器页面找不到了怎么办,处理搜狗浏览器提示“无法解析服务器的DNS地址”的方法...
  9. c语言中元音字母对应的的值,全国计算机等级考试二级C语言南开上机百题改错题第59...
  10. python绘图库seaborn_Matplotlib Toolkits:python高级绘图库seaborn