Uva(11404)(Palindromic Subsequence)

链接:https://vjudge.net/problem/UVA-11404
思路:因为最大回文串,也就是前后两端相等,那么很容易想到把原串倒过来然后求最长公共子序列,求出来的值就刚好是最大回文串的长度(因为是和倒置的串求最长公共子序列,所以求出来一定是回文串),关键是如何输出这个回文串。因为有字典序,所以为了方便起见我们用string(重载了min函数可求字段序,虽然比较慢一点),然后动态规划中条件要改,详见代码
代码:

#include<iostream>
#include<cstring>
using namespace std;
string a,b;
int dp[1001][1001];
string d[1001][1001];

int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
    while(cin>>a){
     b = a;
     for(int i=0;i<a.size();i++)b[i] = a[a.size()-1-i];//倒置原串
        memset(dp,0,sizeof(dp));
       d[0][0] = "";//初始化为空
        for(int i=0;i<a.size();i++){
            for(int j=0;j<b.size();j++){
                if(a[i]==b[j]){
                    dp[i+1][j+1] =  dp[i][j] + 1;
                    d[i+1][j+1] = d[i][j] + a[i];
                }
                    else {
//如果不等就用长度大的那一个的长度和回文
                        if(dp[i][j+1]>dp[i+1][j]){
                            dp[i+1][j+1] = dp[i][j+1];
                        d[i+1][j+1] = d[i][j+1];
                    }
                    else if(dp[i][j+1]<dp[i+1][j]){
                        dp[i+1][j+1] = dp[i+1][j];
                        d[i+1][j+1] = d[i+1][j];
                    }
//如果相等的时候则要比较二者的字典序大小
                    else{
                        dp[i+1][j+1] = dp[i][j+1];
                        d[i+1][j+1] = min(d[i+1][j],d[i][j+1]);
                    }
            }
            }
        }
        int res = dp[a.size()][a.size()];
//要分长度为奇数和偶数进行输出最大回文串
        if(res%2){
        for(int i=0;i<res/2;i++)cout<<d[a.size()][a.size()][i];
        for(int i=res/2;i>=0;i--)cout<<d[a.size()][a.size()][i];
            cout<<endl;
        }
        else{
            for(int i=0;i<res/2;i++)cout<<d[a.size()][a.size()][i];
                for(int i=res/2-1;i>=0;i--)cout<<d[a.size()][a.size()][i];
            cout<<endl;
        }
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • KMP 学习记录 kuangbin专题十六——KMP KMP 学习总结 朴素 KMP 算法 拓展 KMP 算法(E...
    染微言阅读 3,658评论 0 3
  • 惊鸿一瞥 揽了百年的相思 前半生我读了你朦胧的额 后半生只望见你秀美的发 中间的一天是你的蕾 羞了明日俏美的弯月 ...
    占峰斯人阅读 3,021评论 0 5
  • 今天去了巨石阵,坐车很不舒服,所以没有好好参观。 下午去了Bath, 每走一步都觉得是有故事的地方,因为有她,简奥...
    原味石阅读 1,886评论 0 0
  • 再拾起 月光烂漫旋律 也妄想, 飞鸟飞入海底 你,于我人生虚席
    辰筱言阅读 1,409评论 0 1

友情链接更多精彩内容