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 }

 

你可能感兴趣的:(poj)