UVA 11404 Plalidromic Subsquence (回文子序列,LCS)
最长回文子序列可以用求解原串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)的更多相关文章
- 最长回文子序列LCS,最长递增子序列LIS及相互联系
最长公共子序列LCS Lintcode 77. 最长公共子序列 LCS问题是求两个字符串的最长公共子序列 \[ dp[i][j] = \left\{\begin{matrix} & max(d ...
- 动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )
1.问题描述 给定一个字符串(序列),求该序列的最长的回文子序列. 2.分析 需要理解的几个概念: ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblo ...
- 51NOD 1092 回文字符串 LCS
Q:给定一个串,问需要插入多少字符才能使其成为回文串,也就是左右对称的串. 经典求LCS题,即最长公共子序列,不用连续的序列.考虑O(n^2^)解法,求LCS起码得有两个串,题中才给了一个串,另一个需 ...
- NOIP2016提高组初赛(2)四、读程序写结果3、求最长回文子序列
#include <iostream> using namespace std; int lps(string seq, int i, int j) { int len1, len2; i ...
- 最长回文子序列(LPS)
问题描述: 回文是正序与逆序相同的非空字符串,例如"civic"."racecar"都是回文串.任意单个字符的回文是其本身. 求最长回文子序列要求在给定的字符串 ...
- [LeetCode] Count Different Palindromic Subsequences 计数不同的回文子序列的个数
Given a string S, find the number of different non-empty palindromic subsequences in S, and return t ...
- [LeetCode] Longest Palindromic Subsequence 最长回文子序列
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
- [Swift]LeetCode516. 最长回文子序列 | Longest Palindromic Subsequence
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the ma ...
- hdu-4632 Palindrome subsequence (回文子序列计数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 问题要求回答一串字符串中回文子序列的数量,例如acbca就有 a,c,b,c,a,cc,aa,a ...
随机推荐
- 洛谷P3803 【模板】多项式乘法(FFT)
P3803 [模板]多项式乘法(FFT) 题目背景 这是一道FFT模板题 题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: ...
- 前后分离调用API跨域
前后分离调用API接口跨域问题 什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的跨域: 资源跳转:A链接.重定向.表单提交. 资源嵌入: <li ...
- “戏精少女”的pandas学习之路,你该这么学!No.5
如果文章图片无法观看,请前往CSDN博客观看 https://blog.csdn.net/hihell 戏精博主即将上线 就在上一篇,梦想橡皮擦这位博主经过艰苦的努力 终于能创建一个dataframe ...
- php数组处理函数
array_reverse()数组反向排序,$arr=array_reverse($arr)
- PowerDesigner如何将字段的注释显示出来
选定一个编辑的表,右键- >Properties- >Columns- >Customize Columns and Filter(或直接用快捷键Ctrl+U)- >Comme ...
- POJ1034 The dog task
题目来源:http://poj.org/problem?id=1034 题目大意: 一个猎人在遛狗.猎人的路径由一些给定的点指定.狗跟随着猎人,要与主人同时到达那些指定的点.在丛林里有一些有趣的地方, ...
- codeforces C. Vasya And The Mushrooms (思维+模拟)
题意:给定一个2*n的矩形方格,每个格子有一个权值,从(0,0)开始出发,要求遍历完整个网格(不能重复走一个格子),求最大权值和,(权值和是按照step*w累加,step步数从0开始). 转载: 题解 ...
- hdu3949(线性基,求第k小的异或和
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 XOR Time Limit: 2000/1000 MS (Java/Others) Me ...
- OpenStack Weekly Rank 2015.07.20
Module Reviews Drafted Blueprints Completed Blueprints Filed Bugs Resolved Bugs Cinder 8 1 3 9 10 Sw ...
- (转)SELinux是什么意思,如何关闭?Linux下的防火墙用什么命令打开?
SELinux是什么意思,如何关闭?Linux下的防火墙用什么命令打开? 原文:http://blog.csdn.net/hhcccchh/article/details/12995539 SELin ...