最长回文子序列可以用求解原串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. (PHP)redis Zset(有序集合 sorted set)操作

    /** * * Zset操作 * sorted set操作 * 有序集合 * sorted set 它在set的基础上增加了一个顺序属性,这一属性在修改添加元素的时候可以指定,每次指定后,zset会自 ...

  2. Cogs 9. 中心台站建设

    9. 中心台站建设 ★★☆   输入文件:zpj.in   输出文件:zpj.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     n个城市之间有通讯网络,从这n个城 ...

  3. 唯快不破:Web 应用的 13 个优化步骤

    时过境迁,Web 应用比以往任何时候都更具交互性.搞定性能可以帮助你极大地改善终端用户的体验.阅读以下的技巧并学以致用,看看哪些可以用来改善延迟,渲染时间以及整体性能吧! 更快的 Web 应用 优化 ...

  4. linker 错误解决办法 地图

  5. DNS解析工具--nslookup和dig使用

    1.nslookup使用 [root@master ~]# nslookup> server 8.8.8.8    #指定域名服务器Default server: 8.8.8.8Address: ...

  6. 兼容IE的login表单巧妙写法

    利用label来写: HTML: <div class="loginwrap"> <label for="phonenumber" class ...

  7. $each 遍历json字符串

    $.each遍历json对象   查看一个简单的jQuery的例子来遍历一个JavaScript数组对象. var json = [ {"id":"1",&qu ...

  8. Eclipse设置代码模板Code Template

    团队协作最好是使用相同的代码模板 Code Template,打开 Window -> Preference -> Java -> Code Style -> Code Tem ...

  9. DateAdapterForDay

    public class DateAdapterForDay extends XmlAdapter<String, Date> { private SimpleDateFormat dat ...

  10. APP请求超时问题-ios超时-android超时

    最近发现公司的app在高峰期超时严重.用wifi网络一直超时,但qq等却正常.换成手机卡网络正常. 起初以为是DNS解析问题. 后来抓包,发现DNS解析正常,可以得到正确的A记录. 但tcp retr ...