关闭

CodeForces 335b Palindrome 动态规划

标签: codeforcesdp
344人阅读 评论(0) 收藏 举报
分类:

求给定字符串的最长回文子序列。

f[i][j]表示前i个字符已经处理到长度为j的回文子串的最右位置(为最大化答案)。

g[i][j]表示前i个字符中离i最近的字符j的位置。

有f[i][j]=max(f[i-1][j], p[f[i-1][j-2]-1][str[i]])

一种是继承前i-1字符的结果,另一种是令str[i]为当前回文子串的结尾,结果为找到f[i-1][j-2]的左端前和str[i]相等的字符。

然后f[n][t]中最大的t有解的为结果。

输出答案按照dp方程找即可。

当前查询前t个字符的话,找上一个字符的范围就是1..p[t][str[f[t][k]]]-1.

神TM数组开小了f答案全乱了。。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define FOR(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int N = 50005;
char str[N]={0}, ans[N];
int p[N][26], f[N][101]={0};
int main() {
	int n, i, j, k, l = 0, t;
	scanf("%s", str+1);
	t = n = strlen(str+1);
	FOR(i,1,n) str[i]-='a';
	FOR(i,1,n) memcpy(p[i],p[i-1],sizeof(p[0])),p[i][str[i]]=i;
	FOR(i,1,n) f[i][0]=i+1,f[i][1]=i;
	FOR(i,2,n) FOR(j,2,100)
		f[i][j]=max(f[i][j],(f[i-1][j-2])?(<span style="font-family: Arial, Helvetica, sans-serif;">p[f[i-1][j-2]-1][str[i]]):(f[i-1][j]));</span>
	FOR(i,0,100) if(f[n][i]) k=i;
	while (k > 1) {
		ans[l++]=str[f[t][k]]+'a';
		t=p[t][str[f[t][k]]]-1;
		k-=2;
	}
	ans[l]=0;
	printf("%s", ans);
	if(k)printf("%c",str[f[t][k]]+'a');
	reverse(ans, ans+l);
	printf("%s", ans);
	return 0;
}


B. Palindrome
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Given a string s, determine if it contains any palindrome of length exactly 100 as asubsequence. If it has any, print any one of them. If it doesn't have any, print a palindrome that is a subsequence of s and is as long as possible.

Input

The only line of the input contains one string s of length n (1 ≤ n ≤ 5·104) containing only lowercase English letters.

Output

If s contains a palindrome of length exactly 100 as a subsequence, print any palindrome of length 100 which is a subsequence of s. If s doesn't contain any palindromes of length exactly 100, print a palindrome that is a subsequence of s and is as long as possible.

If there exists multiple answers, you are allowed to print any of them.

Sample test(s)
input
bbbabcbbb
output
bbbcbbb
input
rquwmzexectvnbanemsmdufrg
output
rumenanemur
Note

A subsequence of a string is a string that can be derived from it by deleting some characters without changing the order of the remaining characters. A palindrome is a string that reads the same forward or backward.



0
0
查看评论

Palindrome Partitioning与动态规划

首先看Leetcode上的Palindrome Partitioning题目: Given a string s, partition s such that every substring of the partition is a palindrome. Re...
  • xyzker
  • xyzker
  • 2015-09-24 11:39
  • 496

Codeforces 335B Palindrome 鸽巢原理 + DP

题目大意: 就是现在给出一个长度不超过5*10^4的串, 求其最长回文串, 如果回文串长度超过100只需要输出长度为100的即可, 输入的字符串只包含26种小写英文字母 另外就是这个题目中的回文串并不要求在原来的串当中是连续出现的, 只需要出现的位置顺序一样即可, 并不要求连续 大致思...
  • u013738743
  • u013738743
  • 2015-03-03 19:55
  • 573

CodeForces 600C Make Palindrome 贪心

题意:给出字符串s,通过调整顺序或修改字符使字符串回文,输出修改次数最小且紫苜蓿最小的回文字符串。 统计一下字母次数,字母序后的出现次数奇数的改成字母序小的,然后贪心选能使用的最小字符构建回文字符串即可。 #include #include int main() { int i, j...
  • huanghongxun
  • huanghongxun
  • 2015-11-28 22:33
  • 726

hdu1513 Palindrome 动态规划

求让一个字符串变为回文串所需最少插入字符数定义状态dp[i][j]dp[i][j] 表示从左到右i个字符,从右到左j个字符,要让他们回文需要插入多少字符显然,a[i]==a[j]a[i]==a[j]时,dp[i][j]=dp[i−1][j−1]dp[i][j]=dp[i-1][j-1] a[i]...
  • zjtzyrc
  • zjtzyrc
  • 2015-05-16 14:50
  • 162

codeforces 600C. Make Palindrome(贪心)

题目链接:【C. Make Palindrome】 Educational Codeforces Round 2 输入一串字符串,用最少的步数把它变成回文串,得到的回文串字典序最小 先改变一些字母,然后改变顺序,改变顺序不算步数 回文串的特点是左右对称,当长度是偶数时,串上的字母的个数全...
  • saragrean
  • saragrean
  • 2015-11-30 19:44
  • 309

Codeforces Beta Round #7--D. Palindrome Degree(hash)

D. Palindrome Degree time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output String...
  • u013015642
  • u013015642
  • 2015-03-12 10:59
  • 853

codeforces_600C. Make Palindrome(贪心)

C. Make Palindrome time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output ...
  • christry_stool
  • christry_stool
  • 2016-04-05 20:04
  • 170

CodeForces 600C Make Palindrome

题意: 改变最少的字母,得到一个典序最小的回文串。可以重排,重排不算操作次数。 思路 统计个数,如果是偶数,两侧放,奇数的话找一个后面的奇数抵消,如果找不到放在中间 #include #include #include #include #include #include #in...
  • qq_33951440
  • qq_33951440
  • 2017-05-12 10:32
  • 85

Codeforces 486C Palindrome Transformation(贪心)

题目链接:Codeforces 486C Palindrome Transformation 题目大意:给定一个字符串,长度N,指针位置P,问说最少花多少步将字符串变成回文串。 解题思路:其实只要是对称位置不相同的,那么指针肯定要先移动到这里,修改字符只需要考虑两种方向哪种更优即 ...
  • u011328934
  • u011328934
  • 2014-11-13 00:02
  • 1327

【Codeforces 600C. Make Palindrome】& 构造

C. Make Palindrome time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output A string is called p...
  • WYK1823376647
  • WYK1823376647
  • 2017-08-23 18:05
  • 152
    个人资料
    • 访问:178675次
    • 积分:6159
    • 等级:
    • 排名:第4818名
    • 原创:449篇
    • 转载:7篇
    • 译文:0篇
    • 评论:7条
    神犇们的后庭院
    wzq_QwQ http://blog.csdn.net/wzq_QwQ
    vmurder http://blog.csdn.net/vmurder/
    PoPoQQQ http://blog.csdn.net/popoqqq/
    YJQ神犇 http://tarawa.github.io/
    ?神?论文
    http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf