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
参考: http://blog.csdn.net/libin56842/article/details/9708807
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define eps 1e-8 typedef __int64 ll; using namespace std; #define N 105 int dp[N][N],ans[N]; char a[N],b[N]; int main() { int i,j; while(~scanf("%s",a)) { scanf("%s",b); int len=strlen(b); memset(dp,0,sizeof(dp)); for(i=0;i<len;i++) dp[i][i]=1; for(i=len-1;i>=0;i--) for(j=i+1;j<len;j++) { dp[i][j]=dp[i+1][j]+1; for(int k=i+1;k<=j;k++) if(b[i]==b[k]) dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]); } for(i=0;i<len;i++) { ans[i]=dp[0][i]; if(a[i]==b[i]) { if(i==0) ans[i]=0; else ans[i]=ans[i-1]; } else for(int k=0;k<i;k++) ans[i]=min(ans[i],ans[k]+dp[k+1][i]); } printf("%d\n",ans[len-1]); } return 0; }