最长回文子序列可以用求解原串s和反转串rv的LCS来得到,因为要求回文串分奇偶,dp[i][j]保存长度,

要求字典序最小,dp[i][j]应该表示回文子序列的端点,所以边界为单个字符,即i+j=len+1。

这题最麻烦的地方在于字典序,我是写了个比较函数,有点暴力(常数大)。

也可以反着定义,这时结点就要保存那个状态的字符串了(这样定义比较字典序的时候常数小)

#include<bits/stdc++.h>
using namespace std; #define MP make_pair
#define fi first
#define se second const int LEN = 1e3+;
char s[LEN],rv[LEN];
int dp[LEN][LEN];
pair<int,int> pre[LEN][LEN];
char val[LEN][LEN]; inline void updata(int i,int j,int v,char c,const pair<int,int> &prv)
{
dp[i][j] = v;
pre[i][j] = prv;
val[i][j] = c;
} const auto nil = MP(,); #define dim(x) [x.fi][x.se]
bool cmpLex(pair<int,int> a,pair<int,int> b)
{
//
while(a != nil && val[a.fi][a.se] == val[b.fi][b.se]){
a = pre dim(a); b = pre dim(b);
}
return val dim(a) < val dim(b);
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif while(gets(s)){
int len = strlen(s);
for(int i = ; i < len; i++){
rv[len--i] = s[i];
}
int hd1,hd2,vl = ;
for(int i = ; i <= len; i++){
int j = len+-i;
dp[i][j] = ; val[i][j] = s[i-]; pre[i][j] = nil;
if(dp[i][j] > vl || ( dp[i][j] == vl && cmpLex( MP(i,j), MP(hd1,hd2) ) ) ){//
vl = dp[i][j];
hd1 = i; hd2 = j;
}
for(int k = ; k < j; k++) dp[i][k] = ;
for(j++; j <= len; j++){
if(s[i-] == rv[j-]){
updata(i,j,dp[i-][j-]+,s[i-],make_pair(i-,j-));
if(dp[i][j] > vl || (dp[i][j] == vl && cmpLex(MP(i,j),MP(hd1,hd2)) ) ){//
vl = dp[i][j];
hd1 = i; hd2 = j;
}
}else {
if(dp[i-][j] > dp[i][j-] || (dp[i-][j] == dp[i][j-] && cmpLex(MP(i-,j),MP(i,j-)) ) ){//
updata(i,j,dp[i-][j],val[i-][j],pre[i-][j]);
}else {
updata(i,j,dp[i][j-],val[i][j-],pre[i][j-]);
}
} }
}
int pv = (vl+)>>,ln = vl; auto u = MP(hd1,hd2);
for(int i = ; i < pv; i++){
s[i] = val[u.fi][u.se];
u = pre[u.fi][u.se];
} s[ln] = '\0';
for(int i = pv; i < ln; i++){
s[i] = s[ln--i];
}
puts(s);
}
return ;
}

UVA 11404 Plalidromic Subsquence (回文子序列,LCS)的更多相关文章

  1. 最长回文子序列LCS,最长递增子序列LIS及相互联系

    最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...

  2. 动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )

    1.问题描述 给定一个字符串(序列),求该序列的最长的回文子序列. 2.分析 需要理解的几个概念: ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblo ...

  3. 51NOD 1092 回文字符串 LCS

    Q:给定一个串,问需要插入多少字符才能使其成为回文串,也就是左右对称的串. 经典求LCS题,即最长公共子序列,不用连续的序列.考虑O(n^2^)解法,求LCS起码得有两个串,题中才给了一个串,另一个需 ...

  4. NOIP2016提高组初赛(2)四、读程序写结果3、求最长回文子序列

    #include <iostream> using namespace std; int lps(string seq, int i, int j) { int len1, len2; i ...

  5. 最长回文子序列(LPS)

    问题描述: 回文是正序与逆序相同的非空字符串,例如"civic"."racecar"都是回文串.任意单个字符的回文是其本身. 求最长回文子序列要求在给定的字符串 ...

  6. [LeetCode] Count Different Palindromic Subsequences 计数不同的回文子序列的个数

    Given a string S, find the number of different non-empty palindromic subsequences in S, and return t ...

  7. [LeetCode] Longest Palindromic Subsequence 最长回文子序列

    Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...

  8. [Swift]LeetCode516. 最长回文子序列 | Longest Palindromic Subsequence

    Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...

  9. hdu-4632 Palindrome subsequence (回文子序列计数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 问题要求回答一串字符串中回文子序列的数量,例如acbca就有 a,c,b,c,a,cc,aa,a ...

随机推荐

  1. 洛谷P1065 作业调度方案

    P1065 作业调度方案 题目描述 我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成.每个工件的每道工序都有指定的加工时间. 每个工件的每个工序称为一个操作 ...

  2. 启动windows .net 3.5 功能

    近期给window 2008 版本安装loadrunner ,发现还需要用户自己打开windows 的 .net 3.5 功能,所以在这里记录一下步骤 激活

  3. 任务计划cron

    在linux中,任务计划分俩:未来时间只执行一次和周期性执行 at:未来时间只执行一次 -V 显示版本信息 -l: 列出指定队列中等待运行的作业:== atq -d: 删除指定的作业:== atrm ...

  4. Bitbucekt Reference

    Bitbucket Server installation guide https://confluence.atlassian.com/bitbucketserver/bitbucket-serve ...

  5. vue-cli 使用sass(scss)

    安装依赖: npm install sass-loader node-sass vue-style-loader --save-dev

  6. 《从0到1学习Flink》—— Flink Data transformation(转换)

    前言 在第一篇介绍 Flink 的文章 <<从0到1学习Flink>-- Apache Flink 介绍> 中就说过 Flink 程序的结构 Flink 应用程序结构就是如上图 ...

  7. SpringMVC09 Converter变流器、数据回显、异常测试

    1.配置web.xml文件 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3// ...

  8. iOS开发ReactiveCocoa学习笔记(一)

    学习 RAC 我们首先要了解 RAC 都有哪些类 RACSignal RACSubject RACSequence RACMulticastConnection RACCommand 在学习的时候写了 ...

  9. SQL语句中的having和where的区别

    --首先,两个都是用来进行筛选的: --区别在于 1.当分组筛选的时候使用having eg: 在emp中,查出最低工资小于1000的部门号 select deptno from emp group ...

  10. Servlet高级部分Listener

    监听器的使用场景: ①:统计在线人数   ②:实现单一登录[一个账号只能在一台机器上登录] Servlet中的8大监听器: 1.         ServletContextListener [接口方 ...