uva 11404

来源:互联网 发布:算法导论中文版pdf云盘 编辑:程序博客网 时间:2024/06/05 17:45
#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;}

0 0
原创粉丝点击