洛谷P4170 [CQOI2007]涂色 题解

题目链接:P4170 [CQOI2007]涂色

题意

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

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

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

考虑区间dp

设 dp[i][j]dp[i][j]dp[i][j] 表示涂区间 [i,j][i,j][i,j] 的最小花费

当 i=ji=ji=j 时,有
dp[i][j]=1dp[i][j]=1 dp[i][j]=1
当 i≠ji\ne ji​=j 时,

  • 若 a[i]=a[j]a[i]=a[j]a[i]=a[j] ,此时只需要 [i+1,j][i+1,j][i+1,j] 或 [i,j−1][i,j-1][i,j−1] 首次涂的时候多涂一格即可
    dp[i][j]=min⁡(dp[i+1][j],dp[i][j−1])dp[i][j]=\min(dp[i+1][j],dp[i][j-1]) dp[i][j]=min(dp[i+1][j],dp[i][j−1])

  • 若 a[i]≠a[j]a[i]\ne a[j]a[i]​=a[j] , a[i],a[j]a[i],a[j]a[i],a[j] 都可以尝试向内扩展,显然 [i,j][i,j][i,j] 首次涂会涂两种颜色,考虑枚举其断点 kkk
    dp[i][j]=min⁡(dp[i][j],dp[i][k]+dp[k+1][j])dp[i][j]=\min(dp[i][j],dp[i][k]+dp[k+1][j]) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])

代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N (int)(55)int n,dp[N][N];
char a[N];
signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);// freopen("check.in","r",stdin);// freopen("check.out","w",stdout);cin >> (a+1);n=strlen(a+1);memset(dp,0x3f,sizeof(dp));for(int i=1; i<=n; i++)dp[i][i]=1;for(int len=2; len<=n; len++)for(int i=1,j=i+len-1; i+len-1<=n; i++,j++){if(a[i]==a[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]);}cout << dp[1][n] << endl;return 0;
}

转载请说明出处

洛谷P4170 [CQOI2007]涂色 题解相关推荐

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

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

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

    废话: 这个题我第一眼看就是贪心呐, 可能是我之前那做过一道类似的题这俩题都是关于染色的 现在由于我帅气无比的学长的指导, 我已经豁然开朗, 这题贪心不对啊, 当时感觉自己好厉害贪心都能想出来 差点就 ...

  3. 【题解】洛谷P1283 平板涂色(搜索+暴力)

    思路 看到n<16 整个坐标<100 肯定想到暴力啊 蒟蒻来一发最简单易懂的题解(因为不会DP哈 首先我们用map数组来存坐标图 注意前面的坐标需要加1 因为输入的是坐标 而我们需要的是格 ...

  4. 洛谷 P1162 填涂颜色题解

    题目描述 由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向.现要求把闭合圈内的所有空间都填写成22.例如:6 \times 66×6的方阵(n=6n=6) ...

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

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

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

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

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

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

  8. 洛谷P1129 [ZJOI2007] 矩阵游戏 题解

    洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...

  9. 洛谷P3336 [ZJOI2013]话旧 题解

    洛谷P3336 [ZJOI2013]话旧 题解 题目链接:P3336 [ZJOI2013]话旧 题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来.回来后,他发现世界大变样了.比丘兽究级 ...

最新文章

  1. 小程序navigateBack,子页面传值给父页面
  2. 第四周实践项目2 算法库——单链表
  3. 特殊方法求1~n的和
  4. 【半小时大话.net依赖注入】(一)理论基础+实战控制台程序实现AutoFac注入
  5. 华为二面!!!被问常用API,这也太偏门了吧,我秀了一波hhhh~
  6. 485光隔离中继器产品特点及应用领域介绍
  7. python2和python3的print语句语法有什么不同_Python3.2的版本,输入print语句总是出错,是什么原因?...
  8. 权限 shareuser certificat Runtime.exec
  9. Qt学习之路(54): 自定义拖放数据对象
  10. VXLAN简明学习笔记(原创)
  11. mes选型与实施指南_六大类型MES企业大盘点告诉你如何选择正确选择MES
  12. C语言-学生管理系统
  13. H265视频转码H264视频
  14. 机器视觉软件入门(2)
  15. does not have a companion object, and thus must be initialized here
  16. 如何调用腾讯的IP库?
  17. torch.randn和torch.rand有什么区别
  18. kindle长期未使用,界面显示电池感叹号
  19. ping服务器网速的工具
  20. 【hexo】基础教程-三-添加网易云音乐

热门文章

  1. 芝诺数解|【二】风禾尽起,且住为佳——重庆租房
  2. do while和while的区别
  3. Java小白的数据库爱情(四)Oracle DDL、DML使用
  4. keras之数据预处理
  5. 程序员老了怎么办?做什么好?
  6. Qt通过QAxWidget来使用flash控件的问题
  7. lightroom初学
  8. 万用表怎么测量电池容量_万用表怎么检测电池容量_电池电量
  9. 用友携YonSuite亮相云栖大会,全方位生态合作再提速
  10. 计算机学院晚会标题,计算机学院举办“计忆留夏·e彩纷呈”2017届毕业生晚会...