zoukankan      html  css  js  c++  java
  • 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("
    ");
        }
        return 0;
    }
  • 相关阅读:
    钱到用时方恨少(随记)
    Ring0 打印log文件
    Mutation Testing(变异测试)
    GitHub
    常用js收藏
    ASP.NET初学者常用知识
    ASP.NET页面刷新方法总结
    C#中抽象类和接口的区别
    GridView 72般绝技
    55种网页常用小技巧
  • 原文地址:https://www.cnblogs.com/ember/p/4899227.html
Copyright © 2011-2022 走看看