Description
Input
The first line contains string A.
The second line contains string B.
The length of both strings will not be greater than 100.
Output
Sample Input
zzzzzfzzzzz abcdefedcba abababababab cdcdcdcdcdcd
Sample Output
67
题目意思
就是把第一组字母改为第二组的字母最短刷几次
一次可以刷一个区间
比如第一次可以刷0-10区间
zzzzzfzzzzz刷为
aaaaaaaaaaa
不说了代码如下
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int main() { char s1[105],s2[105]; int ans[105],dp[105][105]; int i,j,k,len; while(~scanf("%s%s",s1,s2)) { len=strlen(s1); memset(dp,0,sizeof(dp)); for(i=0; i<len; i++) { for(j=i; j>=0; j--) { dp[j][i]=dp[j+1][i]+1;//每个先单独刷 for(k=j+1; k<=i; k++)//j到i的所有刷法 { if(s2[j]==s2[k]) dp[j][i]=min(dp[j][i],(dp[j+1][k]+dp[k+1][i]));//从j刷到i最小的 } } } for(i=0; i<len; i++) ans[i]=dp[0][i];//对ans初始化 for(i=0; i<len; i++) { if(s1[i]==s2[i]) ans[i]=ans[i-1];//位值相等可以不刷 else { for(j=0; j<i; j++) { ans[i]=min(ans[i],(ans[j]+dp[j+1][i]));//求最小值 } } } printf("%d\n",ans[len-1]); } return 0; }