http://acm.hdu.edu.cn/showproblem.php?pid=3853
dp[i][j]表示由空白串刷成b的从i到j位所需要的最小次数。
然后在比较a和b的每一位,再次更新dp表示由a刷成b的最小次数。
#include<iostream> #include<cstring> #include<cstdio> using namespace std; char a[105],b[105]; int dp[105][105],ans[105]; int main() { while(~scanf("%s%s",a,b)) { memset(dp,0,sizeof(dp)); int len = strlen(a); for(int i = 0;i < len;i++) dp[i][i] = 1; for(int i = 1;i < len;i++) { for(int start = 0;start+i < len;start++) { int endd = start+i; dp[start][endd] = dp[start+1][endd]+1; for(int j = start+1;j <= endd;j++) { if(b[start] == b[j]) dp[start][endd] = min(dp[start][endd],dp[start+1][j]+dp[j+1][endd]); } } } if(a[0] == b[0]) dp[0][0] = 0; for(int i = 1;i < len;i++) { if(a[i] == b[i]) dp[0][i] = dp[0][i-1]; else { for(int j = 0;j < i;j++) dp[0][i] = min(dp[0][i],dp[0][j]+dp[j+1][i]); } } printf("%d ",dp[0][len-1]); } return 0; }