hdu 2476 String painter

http://acm.hdu.edu.cn/showproblem.php?pid=2476

先从空白串变成字符串2,dp处理,dp[i][j]表示i到j区间的最小操作数。 然后在计算从字符串1变成字符串2的最小操作数。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 char s1[110],s2[110];
 7 int dp[110][110];
 8 int c[110];
 9 
10 int main()
11 {
12     while(scanf("%s%s",s1,s2)!=EOF)
13     {
14         int n=strlen(s1);
15         for(int i=0; i<n; i++)
16         {
17             for(int j=i; j<n; j++)
18             {
19                 dp[i][j]=j-i+1;
20             }
21         }
22         for(int i=n-2; i>=0; i--)
23         {
24             for(int j=i+1; j<n; j++)
25             {
26                 dp[i][j]=dp[i+1][j]+1;
27                 for(int k=i+1; k<=j; k++)
28                 {
29                     if(s2[i]==s2[k])
30                     dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]);
31                 }
32             }
33         }
34         for(int i=0; i<n; i++)
35         {
36             c[i]=dp[0][i];
37             if(s1[i]==s2[i])
38             {
39                 if(i==0) c[i]=0;
40                 else c[i]=c[i-1];
41             }
42             for(int j=0; j<i; j++)
43             {
44                 c[i]=min(c[i],c[j]+dp[j+1][i]);
45             }
46         }
47         printf("%d\n",c[n-1]);
48     }
49     return 0;
50 }
View Code

 

posted @ 2014-10-17 20:51  null1019  阅读(127)  评论(0编辑  收藏  举报