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

String painter

Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3815    Accepted Submission(s): 1782

Problem Description
There are two strings A and B with equal length. Both strings are made up of lower case letters. Now you have a powerful string painter. With the help of the painter, you can change a segment of characters of a string to any other character you want. That is, after using the painter, the segment is made up of only one kind of character. Now your task is to change A to B using string painter. What’s the minimum number of operations?
Input
Input contains multiple cases. Each case consists of two lines:
The first line contains string A.
The second line contains string B.
The length of both strings will not be greater than 100.
Output
A single line contains one integer representing the answer.
Sample Input
zzzzzfzzzzz abcdefedcba abababababab cdcdcdcdcdcd
Sample Output
6 7

题意:给定两个字符串a和b,求最少需要对a进行多少次操作,才能将a变成b。每次操作时将a中任意一段变成任意一个字母所组成的段。

题解:动态规划题。dp[i][j]表示a中i到j段变成b需要的最少次数。递推公式:dp[i][j]=min(dp[i][k]+dp[k+1][j])(i<=k<j)。接着就是判断分界点了,对于字符串b,只有将相同字符一起刷才能减少操作数。所以每次碰到b[i]==b[k]时,可以减少一次操作,因为刷一次[i,k]再刷[i+1,k-1]和分别刷[i,i][k,k],[i+,k,k+1]是一样的,可操作数会减少。

注意:由于如果一段子串两端相等,会成端更新,从而改变中间子串的字符,所以处理时可假定所以a中单个字符都需要一次变化才能变成b。之后动态规划完成后再处理a和b中形同位置相同字符的情况。

另一种理解方式:不考虑起始串,将起始串默认为空串,找出所有dp值(dp[i][j]表示i到j这段空子串转换成目标串需要的最小次数)后,再通过ans[i]来求得最小变换值。ans[i]表示前i+1长度的子串转换成目标串需要的最小次数。

耗时:15MS/2000MS

#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=110;
int dp[maxn][maxn];
char a[maxn],b[maxn];
int ans[maxn];
int main()
{while(cin>>a>>b){int i,j,k,n,m,p,q,len,t;n=strlen(a);memset(dp,0,sizeof(dp));//为处理方便,一个的时候都需要改变才能得到对应字母。//因为当一段被更新后,两字符串原本相等的值就改变了。for(i=0;i<n;i++)dp[i][i]=1;for(len=2;len<=n;len++)//枚举长度{for(i=0;i<n-len+1;i++)//枚举起点{j=i+len-1;//终点//cout<<i<<" "<<j<<endl;dp[i][j]=dp[i+1][j]+1;//!!由于只有比较的是b[i]=b[k],所以不能用dp[i][j]=dp[i][j-1]+1for(k=i+1;k<=j;k++)//枚举分割点{if(b[i]==b[k]){//cout<<i<<" "<<k<<endl;dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);}}}}for(i=0;i<n;i++)ans[i]=dp[0][i];for(i=0;i<n;i++){//重新计算两字符串中字符相同的点。if(a[i]==b[i]){if(i==0)ans[i]=0;else ans[i]=ans[i-1];}else{for(j=0;j<i;j++)ans[i]=min(ans[i],ans[j]+dp[j+1][i]);}}cout<<ans[n-1]<<endl;}return 0;
}

转载于:https://www.cnblogs.com/junior19/p/6730113.html

HDU2476:String painter(区间dp)相关推荐

  1. HDU-2476 String painter 区间DP

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

  2. LA 4394 String painter 区间DP -

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

  3. uva live 4394 String painter 间隔dp

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

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

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

  5. NYOJ 1067 Compress String(区间dp)

    Compress String 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述 One day,a beautiful girl ask LYH to help her ...

  6. [CF1107E]Vasya and Binary String【区间DP】

    题目描述 Vasya has a string s of length n consisting only of digits 0 and 1. Also he has an array a of l ...

  7. hdu_2476_String painter(区间DP)

    题目链接:hdu_2476_String painter 题意: 有a,b两字符串,现在你有一个刷子,每次可以任选一个区间,使这个区间变成你想要的字符,现在让你将a变成b,问最少刷多少次 题解: 考虑 ...

  8. HDU 2476 String painter (区间DP)

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

  9. UVALive 4394 String painter——dp

    设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, ...

最新文章

  1. StartOS 5.0 正式版发布
  2. LeetCode刷题-6
  3. 'putText' is not a member of 'cv'
  4. 洛谷P2863 [USACO06JAN]牛的舞会The Cow Prom
  5. nginx缓存服务器
  6. AT1983-[AGC001E]BBQ Hard【dp,组合数学】
  7. Python函数参数传递:传值还是传引用
  8. opencv findContours 报错_acrt_first_block == header
  9. BugkuCTF-MISC题linux与linux2
  10. h5获取http请求头_java学习之路(2),http协议,request类
  11. 阿里云线上案例分析:网格应用存活状态异常
  12. python pycharm 无法import win32api、win32con、win32com、win32gui 问题一次解决!方法合集
  13. c语言病毒分析(转)
  14. 哈佛大学公开课《幸福课》笔记
  15. 计算机视觉(十一):Keras Pipline与自定义模型
  16. numeric scale mysql_mysqldecimal、numeric数据类型
  17. KVM管理虚拟机:常用命令
  18. 关于(求和符号∑)不可不知的事情
  19. ubuntu修改IP地址和网关的方法
  20. Python 用于电路课程

热门文章

  1. Java 抛异常的两种方法
  2. Citrix路径遍历(CVE-2019-19781)
  3. twisted系列教程十三–deferred 中的deferred
  4. python twisted教程 三–开始twisted
  5. 《论文笔记》Adaptive decentralised_cooperative_vision_based_simultaneous_localization_and_mapping_for_mult
  6. win32diskimager报错:An error occured when attempting to XXX, Error 5: Access is Denied
  7. matlab实现线性规划
  8. sqlserver数据库中char、varchar、text与nchar、nvarchar、ntext数据类型使用详解
  9. Mysql 学习之 SQL的执行顺序
  10. 05-类--+-号使用