uva11404 Palindromic Subsequence(DP 求方案)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
char s[1010];
int dp[1010][1010],l;
string str[1010][1010];
int DP(int x,int y){
    if(x>y) return 0;
    if(dp[x][y]!=-1) return dp[x][y];
    int ret=1;
    char Min=s[x];
    for(int i=x+1;i<=y;i++) Min=min(s[i],Min);
    str[x][y]=Min;
    string ans="";
    for(int i=x;i<=y;i++){
        for(int j=y;j>i;j--){
            if(s[i]==s[j]){
                ans+=s[i];
                int z=DP(i+1,j-1)+2,pos;
                if(z>ret){
                    ret=z;
                    str[x][y]=ans+str[i+1][j-1];
                    pos=i;
                }else if(z==ret){
                    if(s[i]<s[pos]) str[x][y]=ans+str[i+1][j-1],pos=i;
                }
                ans="";
            }
        }
    }
    return dp[x][y]=ret;
}
int main(){
    while(gets(s)!=NULL){
        memset(dp,-1,sizeof dp);
        for(int i=0;i<1010;i++){
            for(int j=0;j<1010;j++){
                str[i][j]="";
            }
        }
        l=strlen(s);
        int ret=DP(0,l-1);
        int ansl=str[0][l-1].length();
        for(int i=0;i<ansl;i++) cout<<str[0][l-1][i];
        for(int i=(ret&1) ? ansl-2:ansl-1;i>=0;i--) cout<<str[0][l-1][i];
        cout<<endl;
    }
    return 0;
}
uva11404

 

posted @ 2014-02-08 17:07  wonderzy  阅读(157)  评论(0编辑  收藏  举报