UVA 11404 Palindromic Subsequence[DP LCS 打印]

UVA - 11404

Palindromic Subsequence

题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串



不要求路径区间DP都可以做

然而要字典序最小

倒过来求LCS,转移同时维护f[i][j].s为当前状态字典序最小最优解

f[n][n].s的前半部分一定是回文串的前半部分(想想就行了)

当s的长度为奇时要多输出一个(因为这样长度+1,并且字典序保证最小(如axyzb  bzyxa,就是axb))

//
//  main.cpp
//  uva11404
//
//  Created by Candy on 03/11/2016.
//  Copyright © 2016 Candy. All rights reserved.
//

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1e3+5;
char a[N],b[N];
int n;
//void dp(){
//    n=strlen(a+1);
//    ans=0;
//    //for(int i=1;i<=n;i++) f[i][i]=1;
//    for(int i=n;i>=1;i--){
//        f[i][i]=1;
//        for(int j=i+1;j<=n;j++){
//            f[i][j]=max(f[i+1][j],f[i][j-1]);
//            if(a[i]==a[j]) f[i][j]=max(f[i][j],f[i+1][j-1]+1);
//        }
//    }
//}
struct data{
    int v;
    string s;
    data(){v=0;s="";}
}f[N][N];
void dp(){
    for(int i=1;i<=n;i++) b[i]=a[n-i+1];

    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            if(a[i]==b[j]){
                f[i][j].v=f[i-1][j-1].v+1;
                f[i][j].s=f[i-1][j-1].s+a[i];
            }else{
                if(f[i][j-1].v>f[i-1][j].v){
                    f[i][j].v=f[i][j-1].v;
                    f[i][j].s=f[i][j-1].s;
                }else if(f[i-1][j].v>f[i][j-1].v){
                    f[i][j].v=f[i-1][j].v;
                    f[i][j].s=f[i-1][j].s;
                }else{
                    f[i][j].v=f[i][j-1].v;
                    f[i][j].s=min(f[i][j-1].s,f[i-1][j].s);
                }
            }
        }
}
int main(int argc, const char * argv[]) {
    while(scanf("%s",a+1)!=EOF){
        n=strlen(a+1);
        dp();
        int len=f[n][n].v;
        string s=f[n][n].s;
        if(len&1){
            len/=2;
            for(int i=0;i<len;i++) putchar(s[i]);
            for(int i=len;i>=0;i--) putchar(s[i]);//!
        }else{
            len/=2;
            for(int i=0;i<len;i++) putchar(s[i]);
            for(int i=len-1;i>=0;i--) putchar(s[i]);
        }
        putchar(‘\n‘);
    }

    return 0;
}
时间: 2024-12-25 20:33:23

UVA 11404 Palindromic Subsequence[DP LCS 打印]的相关文章

LPS UVA 11404 Palindromic Subsequence

题目传送门 1 /* 2 LPS(Longest Palidromic Subsequence):最长回文子序列,和回文串不同,子序列是可以不连续的. 3 转化为LCS问题,将字符串逆序,然后和本串求LCS就是LPS的长度(为啥不就是LPS?),但是前一半是LPS的一半,可以补全 4 推荐->还有一种写法是用了LCS的思想,dp[i][j]表示i到j的最长回文串长度,状态转移方程: 5 1. dp[j][j+i-1] = dp[j+1][j+i-2] + 2; (str[j] == str[j+

UVA 11404 Palindromic Subsequence

题解: 神一般的trick 首先求最长回文字符串的长度.只用反过来.转换为LCS问题就行 但是关键的要输出字典序最小的 所以在LCS的过程中.保存相应的字符串,并且保证字符串最小.这么求得的长度是对的.但是不一定是回文字符串 例如 bcbabccb bccbabcb ---> bcabc. 想了很久.可能是因为字典序的问题.当前面一半固定的时候,后面一半应该是前面一半的翻转过来,但是有可能出现和前面一半一样的情景.....(有毒) 具体修改.就是取前面一半即可 代码: #include<bit

【UVa】Palindromic Subsequence(dp+字典序)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=465&page=show_problem&problem=2399 最长的很简单,将串翻转过来后求两个串的lcs就是答案.. 主要是字典序那里... 还是开string来比较吧.. 注意最后输出方案时用前半段推出后半段.(因为可能lcs时会重合...) #include <cstdio> #include

Uva 111-History Grading(DP/LCS)

题目链接:点击打开链接 题意坑.. 本来一看就是就裸LCS ,但题目中给的输入并不是原序列,而是原序列,而是原序列的位置..比如 3 1 2 并不是 s[1]=3 而是1在序列中位置是3 即 s[3]=1; (s[x]=i;) 然后输入处理一下就裸LCS. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <string>

uva 111 - History Grading (dp, LCS)

题目链接 题意:给N,第二行是答案,n个数c1---cn, 代表第一个的顺序是c1,第二个数顺序是c2; 下面每一行是学生的答案,格式同上. 注意:这个给的顺序需要处理一下,不能直接用. 思路:LCS. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespac

uva 11404 dp

UVA 11404 - Palindromic Subsequence 求给定字符串的最长回文子序列,长度一样的输出字典序最小的. 对于 [l, r] 区间的最长回文串,他可能是[l+1, r] 和[l, r-1]两个区间的结果.或者当s[l] == s[r]时,区间[l+1, r-1]的结果再加上以s[l], s[r]为首尾的子序列. dp[l][r] = ans(dp[l][r-1], dp[l+1][r], s[l] + dp[l+1][r-1] + s[r]) dp存的是子序列,即一个s

UVA 11404 五 Palindromic Subsequence

Palindromic Subsequence Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 11404 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <string> 5 #include &l

LeetCode 516. Longest Palindromic Subsequence

516. Longest Palindromic Subsequence Add to List Description Submission Solutions Total Accepted: 2159 Total Submissions: 5216 Difficulty: Medium Contributors: Stomach_ache Given a string s, find the longest palindromic subsequence's length in s. You

poj1458——dp,lcs

poj1458——dp,lcs Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 40529   Accepted: 16351 Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence