String painter
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1117 Accepted Submission(s): 443
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
Source
2008 Asia Regional Chengdu
Recommend lcy 一开始两个字符串很难搞。 其实可以先算由空白串直接变成str2. 用区间DP,可以求出dp[i][j]. 然后再计算从str1变成str2.
//============================================================================ // Name : HDU.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <string.h> #include <algorithm> #include <stdio.h> using namespace std; const int MAXN=110; int dp[MAXN][MAXN]; char str1[MAXN],str2[MAXN]; int ans[MAXN]; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%s%s",str1,str2)==2) { int n=strlen(str1); memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) for(int j=i;j<n;j++) dp[i][j]=j-i+1; //先直接DP求出从空白串变成str2 for(int i=n-2;i>=0;i--) for(int j=i+1;j<n;j++) { dp[i][j]=dp[i+1][j]+1; for(int k=i+1;k<=j;k++) if(str2[i]==str2[k]) dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]); } for(int i=0;i<n;i++) { ans[i]=dp[0][i]; if(str1[i]==str2[i]) { if(i==0)ans[i]=0; else ans[i]=ans[i-1]; } for(int j=0;j<i;j++) ans[i]=min(ans[i],ans[j]+dp[j+1][i]); } printf("%d\n",ans[n-1]); } return 0; }