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 ...
随机推荐
- vimtutor总结
$vimtutor ================================================================================ W e l c o ...
- Flask-SQLAlchemy 配置,处理对象-关系,一对多,多对多
ORM(Object Relational Mapper) 对象关系映射.指将面对对象得方法映射到数据库中的关系对象中. Flask-SQLAlchemy是一个Flask扩展,能够支持多种数据库后 ...
- PostFX v2后期处理特效包:升级更惊艳的视觉效果
https://mp.weixin.qq.com/s/BMkLLuagbhRSWspzeGhK7g Post-Processing Stack后期处理特效包能够轻松创建和调整高质量视觉效果,实现更为惊 ...
- EasyUI/TopJUI之如何动态改变下拉列表框ComboBox输入框的背景颜色
简单记录一下 前段时间接到客户需求:动态改变下拉列表框ComboBox输入框的背景颜色. 刚开始想的很简单在用户选择列表项的时候,判断一下列表框的value值添加相应的背景颜色就OK了,然而在实际操作 ...
- 洛谷P2025 脑力大人之监听电话
题目描述 话说埃菲尔铁塔小区的房子只有一栋,且只有一层,其中每一家都装有一个监听器,具体地,如果编号为第i家的人给编号第\(j\)家的人打了电话,\(i \leq j\),当然,也会有些人无聊地自己给 ...
- 【手撸一个ORM】MyOrm的使用说明
[手撸一个ORM]第一步.约定和实体描述 [手撸一个ORM]第二步.封装实体描述和实体属性描述 [手撸一个ORM]第三步.SQL语句构造器和SqlParameter封装 [手撸一个ORM]第四步.Ex ...
- 强连通图 Tarjan算法
算法学习:https://blog.csdn.net/qq_16234613/article/details/77431043 http://www.cnblogs.com/chenchengxun/ ...
- UiAutomator编译与运行测试代码
编译与运行步骤 1.创建build文件.打开cmd命令窗口,进入工程路径cd E:\workspace\UiAutomatorDemo1,然后输入命令android create uitest-pro ...
- Python 2.x和3.x不同点
1.print和print() 2.yield 出现下面的错误Traceback (most recent call last): File “<pyshell#32>”, line 1, ...
- (转)diff 命令
每天一个linux命令(36):diff 命令 原文:http://www.cnblogs.com/peida/archive/2012/12/12/2814048.html diff 命令是 li ...