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;
}
时间: 2024-10-25 22:31:11

UVA10453的相关文章

uva10453 - Make Palindrome(递推+ 路径输出)

题目:uva10453 - Make Palindrome(递推+ 路径输出) 题目大意:给出一字符串,仅仅只能做增加字符的操作,问最少增加多少字符串可以是的最后的字符串变成回文.并且将这样的字符串(增加长度要是最小的)的任意一种输出. 解题思路:dp[i][j]代表第i个字符到第j个字符之间要增加的最少的字符串.递推公式:s[i] == s[j], dp[i][j] = dp[ i + 1][j - 1]: s[i] != s[j] ,dp[i][j] = min (dp[i + 1][j]

小白书关于动态规划

10192 最长公共子序列 http://uva.onlinejudge.org/index.php?option=com_onlinejudge& Itemid=8&page=show_problem&category=114&problem=1133&mosmsg= Submission+received+with+ID+13297616 */ #include <cstdio> #include <string.h> #include&