回文子序列 (Palindromic Subsequence,UVa 11404)

 1 #include <iostream>
 2 #include <string.h>
 3 #include <string>
 4 #include <fstream>
 5 #include <algorithm>
 6 #include <stdio.h>
 7 #include <vector>
 8 #include <queue>
 9 #include <set>
10 #include <cmath>
11 using namespace std;
12 const double eps = 1e-8;
13 const int INF=0x7fffffff;
14 #define MAXN 1002
15 string s1,s2;
16 string Reverse(string str1)
17 {
18     string str2="";
19     for(int i=str1.length()-1;i>=0;i--)
20     str2+=str1[i];
21     return str2;
22 }
23 struct node
24 {
25     int len;
26     string s;
27     friend bool operator < (const node &op1, const node &op2)
28     {
29         return op1.len == op2.len? op1.s > op2.s: op1.len < op2.len;
30     }
31 }d[MAXN][MAXN];
32 node ans;
33 bool check(string x)
34 {
35     int i=0,j=0;
36     while(i<x.length()&&j<x.length())
37     {
38         if(x[i]==s1[j]){i++;j++;}
39         else j++;
40     }
41     if(i<x.length())return false;
42     return true;
43 }
44 int main()
45 {
46     while(cin>>s1)
47     {
48 
49         s2=Reverse(s1);
50         int len=s1.length();
51         s1='*'+s1;
52         s2='*'+s2;
53 
54         for(int i=0;i<=len;i++)
55         {d[i][0].len=d[0][i].len=0;d[i][0].s=d[0][i].s="";}
56         for(int i=1;i<=len;i++)
57         for(int j=1;j<=len;j++)
58         {
59         if(s1[i]==s2[j])
60         {
61             d[i][j].len=d[i-1][j-1].len+1;
62             d[i][j].s=d[i-1][j-1].s+s1[i];
63             //cout<<ans[i-1][j-1].s<<'*';
64         }
65         else{
66             if(d[i][j-1] < d[i-1][j])
67                 d[i][j] = d[i-1][j];
68             else
69                 d[i][j] = d[i][j-1];
70         }
71         //cout<<ans[i][j].s<<endl;
72         }
73         ans.len = 0;
74         ans.s.clear();
75         for(int i = 1; i < len; ++i)
76             if(ans< d[i][len-i])
77                 ans = d[i][len-i];
78         ans.len *= 2;
79         node temp;
80         for(int i = 0; i < len; ++i)
81         {
82             temp = d[i][len-i-1];
83             temp.len = temp.len*2+1;
84             temp.s += s1[i+1];
85             if(ans < temp)
86                 ans = temp;
87         }
88 
89         if(d[len][len].len%2)ans.s+=Reverse(ans.s).substr(1,d[len][len].len/2);
90         else ans.s+=Reverse(ans.s);
91         cout<<ans.s<<endl;
92     }
93     return 0;
94 }

反序LCS

原文地址:https://www.cnblogs.com/TO-Asia/p/3201460.html