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串
#include<bits/stdc++.h>
char a[105];
char b[105];
int dp[105][105];
int ans[105];
using namespace std;
int main(){
while(~scanf("%s%s", a + 1, b + 1)){
memset(dp, 0, sizeof(dp));
int lena = strlen(a + 1);
int lenb = strlen(b + 1);
for(int i = 1; i <= lenb; i++)
for(int j = i; j <= lenb; j++)
dp[i][j] = j - i + 1;
for(int len = 2; len <= lenb; len++){
for(int l = 1; l + len - 1 <= lenb; l++){
int r = l + len - 1;
for(int k = l; k < r; k++){
if(b[k] == b[r])
dp[l][r] = min(dp[l][r], dp[l][k] + dp[k + 1][r - 1]);
else
dp[l][r] = min(dp[l][r], dp[l][k] + dp[k + 1][r]);
}
}
}
for(int i = 1; i <= lenb; i++){
ans[i] = dp[1][i];
if(a[i] == b[i]){
ans[i] = ans[i - 1];
}
for(int k = 1; k < i; k++){
ans[i] = min(ans[i], ans[k] + dp[k + 1][i]);
}
}
cout << ans[lenb] << endl;
}
}