poj1159Palindrome(最长公共子序列)

http://poj.org/problem?id=1159

这题以前见过 不会 今天做比赛又看到 知道自己不会 就没多想 后来CZ说是水题 最长公共子序列 我就开始想

想到求正序和逆序的最长公共子序列 不知道对不对 就自己想了几个数据试了一下 都过了 就交了 还真蒙对了 ME了一次 又现学的滚动数组

View Code
 1 #include <iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int dp[3][5001];
 5 int main()
 6 {
 7     int i = 0,j = 0,k,n;
 8     char c1[5005],c2[5005];
 9     scanf("%d%*c",&n);
10     gets(c1);
11     for(i = n-1 ; i>= 0 ; i--)
12     {
13         c2[j++] = c1[i];
14     }
15     for(i = 0 ; i <= n ; i++)
16     {
17         dp[0][i] = 0;
18     }
19     dp[1][0] = 0;
20     dp[2][0] = 0;
21     for(i = 1 ; i <= n ; i++)
22     {
23         for(j = 1 ; j <= n ; j++)
24         {
25             if(i%2!=0)
26             {
27                 if(c1[i-1]==c2[j-1])
28                 dp[1][j] = dp[2][j-1]+1;
29                 else
30                 {
31                     if(dp[2][j]>dp[1][j-1])
32                     dp[1][j] = dp[2][j];
33                     else
34                     dp[1][j] = dp[1][j-1];
35                 }
36             }
37             else
38             {
39                 if(c1[i-1]==c2[j-1])
40                 dp[2][j] = dp[1][j-1]+1;
41                 else
42                 {
43                     if(dp[1][j]>dp[2][j-1])
44                     dp[2][j] = dp[1][j];
45                     else
46                     dp[2][j] = dp[2][j-1];
47                 }
48             }
49         }
50     }
51     if(n%2==0)
52     printf("%d\n",n-dp[2][n]);
53     else
54     printf("%d\n",n-dp[1][n]);
55     return 0;
56 }

 

posted @ 2012-08-18 17:51  _雨  阅读(257)  评论(0编辑  收藏  举报