題意:就是給定兩個字符串,第一個是初始串,第二個是目標串,問你把初始串變到目標串最少須要多少串!ios
分析:此題分兩步,第一步是假設開始的初始串是空串,而後就進行區間dp,dp[i][j]表明把區間[i,j]變到與目標串相同的時候最少須要的步數,因此能夠初始化dp[i][j]=dp[i+1][j]+1;spa
而後若是str2[i]==str2[k]就能夠有dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j])。具體看代碼實現吧!code
代碼實現:blog
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int dp[105][105],res[105]; char str1[105],str2[105]; int min(int x,int y) { return x<y?x:y; } int main() { int i,j,k,len; while(scanf("%s%s",str1,str2)!=EOF) { len=strlen(str1); memset(dp,0,sizeof(dp)); for(j=1;j<=len;j++) { for(i=0;i<len-j+1;i++) { dp[i][i+j-1]=dp[i+1][i+j-1]+1; for(k=i+1;k<=i+j-1;k++) { if(str2[i]==str2[k]) dp[i][i+j-1]=min(dp[i][i+j-1],dp[i+1][k]+dp[k+1][i+j-1]); } } } for(i=0;i<len;i++) res[i]=dp[0][i]; for(i=0;i<len;i++) { if(str1[i]==str2[i]) { if(i==0) res[i]=0; else res[i]=res[i-1]; } else { for(j=0;j<i;j++) res[i]=min(res[i],res[j]+dp[j+1][i]); } } printf("%d\n",res[len-1]); } return 0; }