#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s1[1010],s2[2010];
int maxs,temp;
struct node{
int cmp;
string str;
bool operator > (node &a) {//重载 > 号,因为要按字典序决定答案
if (cmp != a.cmp)
return cmp > a.cmp;
return str < a.str;
}
}dp[1010][1010];
int main()
{
int i,j,len,ans;
while(~scanf("%s",s1+1))
{
len = strlen(s1+1);
for(i=1;i<=len;i++)//初始化
{
dp[i][i].cmp = 1;
dp[i][i].str = s1[i];
}
for(int i=len-1;i>=1;i--)
{
for(j = i+1;j<=len;j++)//dp[i][j]从第i个字符到第j个字符之间的最长回文子序列
{
if(dp[i+1][j]>dp[i][j-1])
{
dp[i][j].cmp = dp[i+1][j].cmp;
dp[i][j].str = dp[i+1][j].str;
}
else
{
dp[i][j].cmp = dp[i][j-1].cmp;
dp[i][j].str = dp[i][j-1].str;
}
if(s1[i] == s1[j])
{
dp[i][j].str = s1[i]+dp[i+1][j-1].str+s1[j];
dp[i][j].cmp = dp[i+1][j-1].cmp+2;
}
//dp[i][j] = MAX(dp[i][j],dp[i+1][j-1]+2);//最长回文子序列
}
}
cout<<dp[1][len].str<<endl;
}
return 0;
}
uva 11404
最新推荐文章于 2018-03-18 14:48:00 发布