CodeForces 335b Palindrome 动态规划

原创 2015年11月19日 14:16:34

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

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.



版权声明:转载请注明 http://blog.csdn.net/huanghongxun/ 举报

相关文章推荐

Codeforces 429B Working out (动态规划) -- 解题报告

题目链接题目大意两个人在一个有 n×m 个房间的健身房内健身,每个房间都有一个锻炼可消耗的卡路里数。一个人从 a[1][1] 一路锻炼到 a[n][m] ,每次只能从 a[i][j] 移动到 a[i+...

Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister(动态规划)

B. Sagheer, the Hausmeister time limit per test 1 second memory limit per test 256 megab...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

Codeforces 429B Working out (动态规划)

A - Working out Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I...

CodeForces #?(727A|727B|727D|727F)|贪心|动态规划

727A题目大意:给出s和t,对s有2个操作:一个×2,一个*10+1,问怎么操作能使s变成t。 题解:暴力。。#include typedef long long ll; bool isPowe...

Codeforces #319(Div.2) B. Modulo Sum (动态规划)

题意:两个数n和m,还有a1-an的n个数,判断是否存在该数列的一个子序列,使得子序列元素的和可以被m整除。 看了下官方题解: 分两种情况:n>m 和 nm, 可以判断输出一定为“Yes”。求出前 i...

Codeforces 2B The least round way 动态规划(分类讨论)

B. The least round way time limit per test 5 seconds memory limit per test 64 megabytes ...

codeforces 607B #336B Zuma [区间DP]【动态规划】

题目连接:http://codeforces.com/contest/607/problem/B ————————————————————————-. B. Zuma time limit pe...

POJ 1159 Palindrome (动态规划)

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 48269   Accepted: 1657...

【POJ 3280】 Cheapest Palindrome(动态规划 回文串)

题意:现在有一个由n个字符组成的长度为m的字符串,可以对其通过增加字符或者删除字符来使其变成回文字符串,而增加或者删除字符都有一个花费,求解使该字符串变成回文所进行操作的最小花费.    用dp[st...

Palindrome Partitioning与动态规划

首先看Leetcode上的Palindrome Partitioning题目: Given a string s, partition s such that every substring of...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)