HDU2476:String painter(区间dp)
String painter
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3815 Accepted Submission(s): 1782
The first line contains string A.
The second line contains string B.
The length of both strings will not be greater than 100.
题意:给定两个字符串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)相关推荐
- HDU-2476 String painter 区间DP
题意:给你一个长度相等的A串和B串,每次可以把一个连续的区间刷成一个字母,问从A串到B串的最少操作数. 解法:虽然这类题一看到就知道是区间DP,但是之前只做过类似从空串变成某个串的题目,所以没想到怎么 ...
- LA 4394 String painter 区间DP -
题目地址:http://vjudge.net/problem/UVALive-4394 很明显的区间DP 区间DP的套路就是 d[i][j]的在区间 (i,j) 刷的次数 转移也一般是 d[i][j] ...
- uva live 4394 String painter 间隔dp
// uva live 4394 String painter // // 问题是,在培训指导dp运动主题,乍一看,我以为只是一点点复杂 // A A磕磕磕,两个半小时后,.发现超过例子.然而,鉴于他 ...
- ACM学习历程—HDU2476 String painter(动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意是给定一个起始串和一个目标串,然后每次可以将某一段区间染成一种字符,问从起始串到目标串最少需要染多 ...
- NYOJ 1067 Compress String(区间dp)
Compress String 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描述 One day,a beautiful girl ask LYH to help her ...
- [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 ...
- hdu_2476_String painter(区间DP)
题目链接:hdu_2476_String painter 题意: 有a,b两字符串,现在你有一个刷子,每次可以任选一个区间,使这个区间变成你想要的字符,现在让你将a变成b,问最少刷多少次 题解: 考虑 ...
- HDU 2476 String painter (区间DP)
题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...
- 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, ...
最新文章
- StartOS 5.0 正式版发布
- LeetCode刷题-6
- 'putText' is not a member of 'cv'
- 洛谷P2863 [USACO06JAN]牛的舞会The Cow Prom
- nginx缓存服务器
- AT1983-[AGC001E]BBQ Hard【dp,组合数学】
- Python函数参数传递:传值还是传引用
- opencv findContours 报错_acrt_first_block == header
- BugkuCTF-MISC题linux与linux2
- h5获取http请求头_java学习之路(2),http协议,request类
- 阿里云线上案例分析:网格应用存活状态异常
- python pycharm 无法import win32api、win32con、win32com、win32gui 问题一次解决!方法合集
- c语言病毒分析(转)
- 哈佛大学公开课《幸福课》笔记
- 计算机视觉(十一):Keras Pipline与自定义模型
- numeric scale mysql_mysqldecimal、numeric数据类型
- KVM管理虚拟机:常用命令
- 关于(求和符号∑)不可不知的事情
- ubuntu修改IP地址和网关的方法
- Python 用于电路课程
热门文章
- Java 抛异常的两种方法
- Citrix路径遍历(CVE-2019-19781)
- twisted系列教程十三–deferred 中的deferred
- python twisted教程 三–开始twisted
- 《论文笔记》Adaptive decentralised_cooperative_vision_based_simultaneous_localization_and_mapping_for_mult
- win32diskimager报错:An error occured when attempting to XXX, Error 5: Access is Denied
- matlab实现线性规划
- sqlserver数据库中char、varchar、text与nchar、nvarchar、ntext数据类型使用详解
- Mysql 学习之 SQL的执行顺序
- 05-类--+-号使用