区间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
",ans[n-1]);
54 
55     }
56     return 0;
57 }
原文地址:https://www.cnblogs.com/cherryMJY/p/6071138.html