UVA 11404 Palindromic Subsequence(LCS+最小字典序)

在LCS中如果需要在求LCS的过程中求出其他量,一般不会在两层for循环结束后单独求,而是在LCS的过程中求出来。
如例题:UVA11404 HDU1080
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define ss(s) scanf("%s",s)
#define ret(i,a,b) for(int i=(a);i>=(b);i--)
const int maxn=1000+10;
char s1[maxn],s2[maxn],ans[maxn];
struct node{
    int len;
    string str;
}f[maxn][maxn];
int len;
int main()
{
    while(ss(s1+1)!=EOF)
    {
        len=(int)strlen(s1+1);
        memcpy(s2+1,s1+1,sizeof(char)*len);
        s2[len+1]='\0';
        reverse(s2+1,s2+1+len);
        for(int i=0;i<=len;i++) f[0][i].len=f[i][0].len=0,f[0][i].str=f[i][0].str="";
        rep(i,1,len) rep(j,1,len){
            if(s1[i]==s2[j]) {f[i][j].len=f[i-1][j-1].len+1;f[i][j].str=f[i-1][j-1].str+s1[i];}
            else {
                if(f[i-1][j].len>f[i][j-1].len){
                    f[i][j].len=f[i-1][j].len;
                    f[i][j].str=f[i-1][j].str;
                }
                else if(f[i-1][j].len<f[i][j-1].len){
                    f[i][j].len=f[i][j-1].len;
                    f[i][j].str=f[i][j-1].str;
                }
                else{
                    f[i][j].len=f[i-1][j].len;
                    f[i][j].str=min(f[i-1][j].str,f[i][j-1].str);
                }
            }
        }
        int maxd=f[len][len].len;
        string ans=f[len][len].str;
        if(maxd&1)
        {
            rep(i,0,maxd/2-1) cout<<ans[i];
            ret(i,maxd/2,0) cout<<ans[i];
        }
        else{
            rep(i,0,maxd/2-1) cout<<ans[i];
            ret(i,maxd/2-1,0) cout<<ans[i];
        }
        cout<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值