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 }