UVA 10453 - Make Palindrome(DP)

题目链接

今天多校第一场,我酱油了。。。哎,最近做DP,完全没有感觉啊,这个破题,C RE无数次,用C++过了。。。好假。。

记录路径的本身 和逆序的最长公共子序。

 1 #include <stdio.h>
 2 #include <string.h>
 3 int p[1001][1001];
 4 int main()
 5 {
 6     char str[3001];
 7     int i,j,len;
 8     while(gets(str)!=0)
 9     {
10         memset(p,0,sizeof(p));
11         len = strlen(str);
12         for(i = 1; i <= len; i ++)
13         {
14             for(j = 1; j <= len; j ++)
15             {
16                 if(str[i-1] == str[len-j])
17                     p[i][j] = p[i-1][j-1]+1;
18                 else if(str[i-1] != str[len-j])
19                 {
20                     if(p[i-1][j] < p[i][j-1])
21                         p[i][j] = p[i][j-1];
22                     else
23                         p[i][j] = p[i-1][j];
24                 }
25             }
26         }
27         printf("%d ",len-p[len][len]);
28         for(i = len,j = len;;)
29         {
30             if(str[i-1] == str[len-j]&&i >= 1&&j >=1)
31             {
32                 printf("%c",str[i-1]);
33                 i --;j --;
34             }
35             else if(p[i][j] == p[i][j-1]&&j >= 1)
36             {
37                 printf("%c",str[len-j]);
38                 j --;
39             }
40             else if(p[i][j] == p[i-1][j]&&i >= 1)
41             {
42                 printf("%c",str[i-1]);
43                 i --;
44             }
45             else if(i == 0&&j == 0)
46             break;
47         }
48         printf("\n");
49     }
50     return 0;
51 }
posted @ 2012-07-19 17:23  Naix_x  阅读(187)  评论(0编辑  收藏  举报