区间DP HDU 2476
两个字符串s1,s2
从s1->s2
最少刷几次
刷 i->j 都变成一样的+1
1 #include<stdio.h> 2 #include<string.h> 3 4 using namespace std; 5 #define MAXN 110 6 7 int dp[MAXN][MAXN]; 8 char s1[MAXN],s2[MAXN]; 9 int ans[MAXN]; 10 int min1(int a,int b) 11 { 12 return a>b?b:a; 13 } 14 int main() 15 { 16 17 while(scanf("%s%s",s1,s2)!=EOF) 18 { 19 memset(ans,0,sizeof(ans)); 20 memset(dp ,0,sizeof(dp)); 21 int n=strlen(s1); 22 int len,i,j,k; 23 for(i=0;i<n;i++)dp[i][i]=1; 刷n次 肯定是对的 24 25 for(len=2;len<=n;len++) //由短到长 26 { 27 for(i=0;i<n-len+1;i++) 28 { 29 j=i+len-1; 30 dp[i][j]=dp[i+1][j]+1; //加一次 肯定是对的 31 for(k=i+1;k<=j;k++) 32 { 33 if(s2[i]==s2[k]) 34 dp[i][j]=min1(dp[i][j],dp[i+1][k]+dp[k+1][j]); 35 } 36 } 37 } 38 for(i=0;i<n;i++) 39 ans[i]=dp[0][i]; //0->i刷几次 40 for(i=0;i<n;i++) 41 { 42 if(s1[i]==s2[i]) 43 { 44 if(i==0)ans[i]=0; 45 else ans[i]=ans[i-1]; 46 } 47 else 48 { 49 for(j=0;j<i;j++) 50 ans[i]=min1(ans[i],ans[j]+dp[j+1][i]); 51 } 52 } 53 printf("%d\n",ans[n-1]); 54 55 } 56 return 0; 57 }
posted on 2016-11-16 19:18 HelloWorld!--By-MJY 阅读(132) 评论(0) 编辑 收藏 举报