UVA10453

/*
题意: 给若干字符串,添加最少的字符把它们变成回文 ,并输出回文。
记忆化搜索,如果s[i]==s[j],dp[i][j]=dfs(i+1,j-1);
否则 dp[i][j]=min(dp[i][j],dfs(i+1,j),dfs(i,j-1);
最先开始也不造怎么输出,后来看了题解,递归输出 ,新姿势 = =。 
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int dp[1010][1010];
char s[1010];
int dfs(int l,int r)
{
    if(l==r || r<l) return dp[l][r]=0;
    if(dp[l][r]!=INF) return dp[l][r];    
    if(s[l] == s[r])  dp[l][r]=dfs(l+1,r-1);
    else dp[l][r] = min( dp[l][r], min( dfs(l+1,r), dfs(l,r-1))+1);    
    return dp[l][r];
}
void print(int l,int r)
{
    if(r<l) return ;
    if(l==r) 
    {
        printf("%c",s[l]); return ;
    }
    if(s[l]==s[r])
    {
        printf("%c",s[l]);
        print(l+1,r-1);
        printf("%c",s[l]);
    }
    else if(dp[l][r]==dp[l+1][r]+1)
    {
        printf("%c",s[l]);
        print(l+1,r);
        printf("%c",s[l]);
    }
    else 
    {
        printf("%c",s[r]);
        print(l,r-1);
        printf("%c",s[r]);
    }
}
int main()
{
    while(scanf("%s",s)!=EOF)
    {
        int l=strlen(s);
        memset(dp,INF,sizeof(dp));
        dfs(0,l-1);
        printf("%d ",dp[0][l-1]);
        print(0,l-1);
        printf("\n");
    }
    return 0;
}

 

posted @ 2015-10-21 21:57  Ember  阅读(169)  评论(0编辑  收藏  举报