Palindromic Subsequence UVA

来源:互联网 发布:c语言成绩管理系统 编辑:程序博客网 时间:2024/05/21 09:00


感觉转为LCS 其实就可以在弄一个数组,然后按照LCS的形式,,

但是错了。。

而且自己不会表示输出的答案序列。。

看了别人的。

他用的循环不太懂。。大概就是按照判断会问的思路


然后又看了别人的,感觉挺好http://blog.csdn.net/l123012013048/article/details/44493921

至少和LCS的代码像,注意答案是前半部分的重复

#include<bits/stdc++.h>using namespace std;#define mem(a,b) memset(a,b,sizeof(a));#define sf scanf#define pf printf#define bug1 printf("bug1\n");#define N 1005#define M 10#define INF 1e9#define LL long long#define inf 0x3f3f3f3fchar s1[N],s2[N];struct Node {    string ans;    int len;    bool operator >(const Node&a){        if(this->len!=a.len)return this->len>a.len;        return this->ans<a.ans;    }}dp[N][N];char ans[N][N];int main(){    while(~sf("%s",s1+1)){        mem(ans,0);        int len=strlen(s1+1);        for(int i=1;i<=len;++i)s2[len-i+1]=s1[i];        for(int i=1;i<=len;++i){            dp[0][i].len=dp[i][0].len=0;            dp[0][i].ans=dp[i][0].ans="";        }        for(int i=1;i<=len;++i){            for(int j=1;j<=len;++j){                if(s1[i]==s2[j]){                    dp[i][j].ans=dp[i-1][j-1].ans+s1[i];                    dp[i][j].len=dp[i-1][j-1].len+1;                }                else {                    if(dp[i-1][j].len>dp[i][j-1].len){                        dp[i][j].ans=dp[i-1][j].ans;                        dp[i][j].len=dp[i-1][j].len;                    }                    else if(dp[i-1][j].len<dp[i][j-1].len){                        dp[i][j].ans=dp[i][j-1].ans;                        dp[i][j].len=dp[i][j-1].len;                    }                    else{                        dp[i][j].ans=min(dp[i-1][j].ans,dp[i][j-1].ans);                        dp[i][j].len=dp[i][j-1].len;                    }                }            }        }        int Len = dp[len][len].len;        string str = dp[len][len].ans;        if(Len & 1) {            int mid = Len / 2;            for(int i = 0; i < mid; i++)                cout << str[i];            for(int i = mid; i >= 0; i--)                cout << str[i];        }        else{            int mid = Len / 2;            for(int i = 0; i < mid; i++)                cout << str[i];            for(int i = mid-1; i >= 0; i--)                cout << str[i];        }        puts("");    }}


0 0