设ans[i]为区间[1,i]已经染好的最小花费

若s[i]=t[i],ans[i]=ans[i-1]

否则ans[i]=min{ans[j-1]+cost(j,i)},cost(j,i)为区间[j,i]染好的最小花费,1<=j<=i

然而会发现cost(j,i)其实是一个子问题,还是不好计算,但这提示我们可以往区间dp上考虑(因为上面问题实际上是一刀切出两个子问题,和区间dp很像)

在考虑区间dp之前我们先简化一下问题,我们发现cost(j,i)其实也可以表示s[j~i]与t[j~i]每一位都不相同时的最小染色花费,而每位都不想同的话就等价于从一个空串出发进行染色,所以我们区间dp要求的是一个空串染成t的最小花费

设dp[i][j]为区间[i,j]染成好的最小花费(空串->t串)

若t[i]==t[k],dp[i][j]=min{dp[i+1][k]+dp[k+1][j]}

否则 dp[i][j]=min{dp[i][k]+dp[k+1][j]}

本来想说一下这个方程是经过怎样的思考过程得来的,发现解释不太清,这里就说一下方程的含义吧。。。

首先t[i]!=t[k]这一块没什么好解释的,就是严格分为两块进行染色,两块之间没有影响

然后是t[i]=t[k]的情况,这时候区间[i,k]是可以直接在最底下刷一层t[i]的,区间[i+1,k]的最小花费

最后把dp和ans结合起来搞一搞就行

#include <bits/stdc++.h>
using namespace std;
const int maxn = 150;
char a[maxn], b[maxn];
int n, dp[maxn][maxn], ans[maxn];
int main() {while (~scanf("%s", a+1)) {scanf("%s", b+1);n = strlen(a+1);for (int i = 1; i <= n; i++) dp[i][i] = 1, dp[i][i+1] = 0;for (int len = 1; len <= n; len++) {for (int i = 1; i+len-1 <= n; i++) {int j = i+len-1;dp[i][j] = len;for (int k = i; k <= j; k++) {if (i != k && b[i] == b[k]) dp[i][j] = min(dp[i][j], dp[i+1][k]+dp[k+1][j]);else dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j]);}}}ans[0] = 0;for (int i = 1; i <= n; i++) {ans[i] = i;if (a[i] == b[i]) ans[i] = ans[i-1];else {for (int j = 1; j <= i; j++) ans[i] = min(ans[i], ans[j-1]+dp[j][i]);}}printf("%d\n", ans[n]);}return 0;
}

UVALive 4394 String painter——dp相关推荐

  1. UVALive 4394 String painter

    题目大意:有两个字符串A,B,一次刷可以把A串一段刷成同一个字母,问至少要刷几次才能把A串变成B串.串长≤100. 本来以为是个很简单的区间DP,后来发现直接区间DP是不行的,这玩意有后效性:刷完一整 ...

  2. uva live 4394 String painter 间隔dp

    // uva live 4394 String painter // // 问题是,在培训指导dp运动主题,乍一看,我以为只是一点点复杂 // A A磕磕磕,两个半小时后,.发现超过例子.然而,鉴于他 ...

  3. LA 4394 String painter 区间DP -

    题目地址:http://vjudge.net/problem/UVALive-4394 很明显的区间DP 区间DP的套路就是 d[i][j]的在区间 (i,j) 刷的次数 转移也一般是 d[i][j] ...

  4. HDU2476:String painter(区间dp)

    原文地址:http://blog.csdn.net/a601025382s/article/details/12379565 原文作者:knownothing String painter Time ...

  5. 动态规划训练11 [String painter HDU - 2476]

    String painter HDU - 2476 题意: 我认为这是一道比较难的问题,自己想了很久,没有想出来怎么做,可能是因为思维僵化吧,一直在想怎么直接的由A变到B,事实上,可以有中间桥梁连接A ...

  6. HDU-2476 String painter 区间DP

    题意:给你一个长度相等的A串和B串,每次可以把一个连续的区间刷成一个字母,问从A串到B串的最少操作数. 解法:虽然这类题一看到就知道是区间DP,但是之前只做过类似从空串变成某个串的题目,所以没想到怎么 ...

  7. HDU 2476 String painter (区间DP)

    题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...

  8. UVALive - 4394 (区间dp)

    题意: 给出两个字符串:每次可以选择第一个字符串的一个区间,全部刷成某一个字母: 问最少刷几次可以刷成第二个串. 题解: 假设a是一个空串,设dp[i][j]为把空串a的[i,i+len-1]位置刷成 ...

  9. ACM学习历程—HDU2476 String painter(动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意是给定一个起始串和一个目标串,然后每次可以将某一段区间染成一种字符,问从起始串到目标串最少需要染多 ...

最新文章

  1. java 套接字关联的通道_Java 通道教程 – NIO 2.0
  2. iOS10 推送必看 UNNotificationContentExtension
  3. 数据库异常 :java.sql.SQLException: Access denied for user ‘root‘@‘localhost‘ (using password: YES)
  4. HDOJ 1176 免费馅饼 -- 动态规划
  5. Summer Training day6 coseforces339D 线段树、位操作
  6. java耗时操作阻塞_spring boot高并发下耗时操作的实现方法
  7. 微型计算机广告牌实验报告,微型计算机实验报告1资料.doc
  8. springboot static访问不到_Spring Boot 的静态资源处理
  9. ssis 包部署_如何使用各种选项从SSIS目录执行已部署的程序包
  10. TensorFlow手把手教你概率编程:TF Probability内置了开源教材,新手友好
  11. screenX,clientX,pageX,offsetX,的区别
  12. ×××S 2012 高级图表类型 -- 小面积扇形处理
  13. 获取自Linux上的Epoch以来的当前时间,Bash
  14. 大数据分析对供应链有什么影响
  15. 黑客动画吧-黑客闯关之古墓探秘攻略
  16. 计算机转魔方最快多少,人类最快还原魔方的极限时间是几秒?
  17. 蓝牙钥匙解决方案 BLE RSSI 测距
  18. 借呗提前还款算法模拟
  19. 性能服务器主板如何进bois,各种主板进入BIOS设置的图文教程
  20. 远程桌面从服务器拷文件出错

热门文章

  1. 2008nian元旦
  2. RK3308设置GPIO的方法
  3. 重写和重载有什么区别
  4. C++程序报错0xc000007b解决方法
  5. 图像处理:直方图规定化
  6. tlp导致linux运行缓慢,在deepin 20系统中使用tlp但无法自动降频的处理
  7. Python3.7,在Anaconda中安装PIL
  8. 【KMP】OKR-Periods of Words
  9. 电脑重装系统以后出现 error: unknown filesystem怎么办?
  10. FlEAPHP + Smarty 进行php开发