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 ofcharacters of a string to any other character you want. That is, after using the painter, the segment ismade up of only one kind of character. Now your task is to change A to B using string painter. What’sthe minimum number of operations?
InputInput
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的步数,每步可将任意区间变更成任意字符。
思路:
先表示出从空到b字串的区间的更新次数。然后判断从a到b可以省的步数
是比较有想法的题,感觉挺好的一个题
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int dp[105][105],ans[105];
char a[105],b[105];
while(~scanf("%s%s",a,b))
{
int len=strlen(a);
memset(dp,0,sizeof(dp));
for(int r=0;r<len;r++)//区间长度
for(int i=0;i+r<len;i++)//起点
{
int j=i+r;
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]);
}///对于空白到目标b来说操作次数
for(int i=0;i<len;i++)
ans[i]=dp[0][i];
for(int i=0;i<len;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]);
}
}