HDU 4745 Two Rabbits(非连续最长回文子序列,区间DP)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

HDU 4745 Two Rabbits(非连续最长回文子序列,区间DP)

HDU 4745 Two Rabbits

题目地址

题意
两只兔子,在n块围成一个环形的石头上跳跃,每块石头有一个权值ai,一只从左往右跳,一只从右往左跳,每跳一次,两只兔子所在的石头的权值都要相等,在一圈内(各自不能超过各自的起点,也不能再次回到起点)它们最多能经过多少个石头(1 <= n <= 1000, 1 <= ai <= 1000)。

分析
其实就是求一个环中,非连续最长回文子序列的长度。
dp[i][j] = max{ dp[i + 1][j], d[i][j - 1], (if a[i] == a[j]) dp[i + 1][j - 1] + 2 }
但是,这个dp公式仅仅是求出一个序列的非连续最长回文子序列,题目的序列是环状的,有两种思路:

  1. 将环倍增成链,求出窗口为n的最长子序列,但这不是最终的解,你可以试看看Sample 2,是只能得出4,因为它在选中的回文外面还可以选中一个当做起点来跳,所以外面得判断找出来的回文外面是否还有可以当起点的石头,即可以找窗口为(n-1)的长度+1。所以解即找 窗口为n的长度或者 窗口为(n-1)的长度+1 的最大值。

  2. 不倍增,直接当成一个链求dp,然后把链切成两半,求出两边的回文长度,最大的和就是解。这里不用考虑起点问题,因为两边的回文中点都可以做起点。

CODE
解法1:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  Blog:        http://blog.csdn.net/hcbbt
*  File:        4745.cpp
*  Create Date: 2014-02-06 13:39:27
*  Descripton:  dp 
*/

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1001<<1;

int dp[N][N];
int a[N];
int n;

int main() {
	while (scanf("%d", &n) && n) {
		for (int i = 1; i <= n; i++) {
			scanf("%d", &a[i]);
			a[n + i] = a[i];
		}

		memset(dp, 0, sizeof(dp));
		for (int i = 1; i <= 2 * n; i++)
			dp[i][i] = 1;

		for (int len = 1; len < 2 * n; len++) {
			for (int i = 1; i + len <= 2 * n; i++) {
				int j = i + len;
				dp[i][j] = max(dp[i + 1][j], max(dp[i][j - 1], (a[i] == a[j] ? dp[i + 1][j - 1] + 2 : 0)));
			}
		}

		int ans = 0;
		for (int i = 1; i <= n; i++)
			ans = max(ans, dp[i][i + n - 1]);
		for (int i = 1; i <= n; i++)
			ans = max(ans, dp[i][i + n - 2] + 1);
		printf("%d\n", ans);
	}
	return 0;


解法2:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  Blog:        http://blog.csdn.net/hcbbt
*  File:        4745.cpp
*  Create Date: 2014-02-06 13:39:27
*  Descripton:  dp 
*/

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1001;

int dp[N][N];
int a[N];
int n;

int main() {
	while (scanf("%d", &n) && n) {
		for (int i = 1; i <= n; i++)
			scanf("%d", &a[i]);

		memset(dp, 0, sizeof(dp));
		for (int i = 1; i <= n; i++)
			dp[i][i] = 1;

		for (int len = 1; len < n; len++) {
			for (int i = 1; i + len <= n; i++) {
				int j = i + len;
				dp[i][j] = max(dp[i + 1][j], max(dp[i][j - 1], (a[i] == a[j] ? dp[i + 1][j - 1] + 2 : 0)));
			}
		}

		int ans = 0;
		for (int i = 1; i <= n; i++)
			ans = max(ans, dp[1][i] + dp[i + 1][n]);
		printf("%d\n", ans);
	}
	return 0;
}


总结
遇到环首先考虑拆成链或者dp。

最长回文子序列(动态规划) 最长回文子序列问题 动态规划 阅读详情

相关推荐

hdu4745最长回文子序列

hdu 4745 题意:两只兔子在玩跳石头游戏; 题解:就是求这条串 和最长的两条回文子串(子串可以不连续,但是不可以相交), 网上还有一种解法就是将两个这样的串连起来,然后在长度最多为n的子区间最长回文子串, 结果就是所有长度为 区间长度为n 的dp[k][k+n-1]值, 或者为dp[k][k+n-2]+1 (可以理解为最开始站在k+n-1这块石头上, 实际上可以由第一种方法推出来); 代...

qq_41856950的博客 251

HDU - 4745 Two Rabbits

题意:给出一个长度为n的环状序列,两只兔子各自从一个点出发,一个顺时针跳,一个逆时针跳,每个时刻都要求两只兔子所在的数字是相同的,兔子最多跳一个圈~~~问兔子们最多能跳多少次 思路:求最长回文串,然后枚举dp[0,i]+dp[i+1,n-1]就是最大值了,试想一只兔子从[0,i]中对称的一点开始,另一只兔子从[i+1,n-1]的对称点开始跳,注意求的是两只兔子一共跳了多少 #include

那些年 904

HDU 4745区间dp最长非连续回文子序列

题意:输入一个序列,两只兔子分别顺时针、逆时针走,同一时刻它们到的石头上的数值要相同,最多只能走一圈,并且不能回到起点。。求走过的最多步数。 思路:dp最长回文子序列。由于是一个环,所以起始位置可以任何位置(两只兔子也可以在同一块石头上)。例如有11个数,1 2 3 4 3 2 1     8 9 9 8,从第七个数断开,左边是一个长度为7的回文串,右边是一个长度为4的回文串,假设起点从4开始

持之以恒 872

经典算法——最长回文子序列

最长回文子序列LPS(Longest Palindromic Subsequence)问题 一个字符串有许多子序列,比如字符串cabbeaf,它的子序列有c、abb、e、a、f,可以通过删除某些字符而变成回文字符串,字符串“cabbeaf”,删除掉‘c’、'e'、‘f’后剩下的子串“abba”就是回文字符串,也是其中最长回文子序列。注意和最长回文子串的区别,最长回文子串必须是连续的,这

henryzhihua 3万+

HDU 4745 Two Rabbits非连续最长回文子序列区间DP

题目大意:两只兔子,在n块围成一个环形的石头上跳跃,每块石头有一个权值ai,一只从左往右跳,一只从右往左跳,每跳一次,两只兔子所在的石头的权值都要相等,在一圈内(各自不能超过各自的起点,也不能再次回到起点)它们最多能经过多少个石头(1 <= n <= 1000, 1 <= ai <= 1000)。解题思路:其实就是求一个环中,非连续最长回文子序列的长度。 dp[i][j] = max{ dp[i

cdsszjj的博客 357

HDU 4745 Two Rabbits

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4745 题目分析 这个题目乍一看觉得很麻烦,不过仔细读题就会发现一个重要的条件:两个兔子不会相互穿过,也就是说,两个兔子始终在一个环里面走;而且在任意时刻,两个兔子所在的位置的权值一样,那么我们设想一下两个兔子都从终点出发,看他们最远可以走多少步,这样等价于两个兔子从任意位置出发最后聚集于同一...

天际苍穹的博客 389

HDU-4745-Two Rabbits

HDU-4745-Two Rabbits 传送门 这一道题是区间dp.最长回文子序列。 题目大意:有两只兔子。一个只往顺时针方向跳。一个只往逆时针方向跳。这两只兔子每次跳的石头的重量必须相同。 所以很明显啦~有关于回文串的 当初思考的时候想把前面n-1个数直接放在n的后面。。然而。。出现了bug。这个求的区间dp是连续的。但是题目要求的可以不连续。。呃。。 这样思考 我们可以获得两个回文串。然后把...

qq_44624316的博客 332

HDU 4745——Two Rabbits区间DP & 最长回文子序列

题目传送门 Problem Description Long long ago, there lived two rabbits Tom and Jerry in the forest. On a sunny afternoon, they planned to play a game with some stones. There were n stones on the ground and...

NIRVANA REBIRTH 451

区间dp-hdu-4745-Two Rabbits

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4745 题目意思: 给n个环状的数,A、B两人沿相反的方向走,每单位时间走一步,要求相同时间两人到达相同的数,且同一位置同一个人不能走两次,走过的位置不能越过。 解题思路: 根据回文非连续序列的性质,从前往后,和从后往前序列是一样的,所以只用求出区间最长的回文序列即可,又由于是环状,所

cc_again的专栏 3405

HDU4745 Two Rabbits区间DP

题目链接:HDU4745 Two Rabbits 题意:有一段环形字符串,两个人相对而行,要使得他们走过的字母序列相同的最长长度是多少;实际上就是求字符串中最长回文子序列的长度,最终答案是取长度为n的区间最长的长度 和 长度为n-1的区间最长的长度+1 的最大值;+1是因为n-1的区间剩下的那个可以被同时当作起点,注意是环形字符串; 分析:根据差分,dp[l][r]=max(dp[l][...

MaJorieL 261

hdu 4745 Two Rabbits最长回文子序列DP

Description Long long ago, there lived two rabbits Tom and Jerry in the forest. On a sunny afternoon, they planned to play a game with some stones. There were n stones on the ground and they were arr...

邵光亮的博客 791

HDU 4745 Two Rabbits (区间dp)

题意:两只兔子,在n块围成一个环形的石头上跳跃,每块石头有一个权值ai,一只从左往右跳,一只从右往左跳,每跳一次,两只兔子所在的石头的权值都要相等,在一圈内(各自不能超过各自的起点,也不能再次回到起点)它们最多能经过多少个石头。 题解:区间dp 其实就是求最长回文子序列长度,对于一个环,可以先求iii到jjj之间的最长回文子序列长度,然后选取一个分割点kkk,这样就不需要再复制一份接到原串后面了,...

gongyuandaye的博客 221

HDU 4745 Two Rabbits 区间DP

题目描述:Description Long long ago, there lived two rabbits Tom and Jerry in the forest. On a sunny afternoon, they planned to play a game with some stones. There were n stones on the ground and they were

喵头鹰的博客 837

HDU4745 Two Rabbits

把模型抽象出来,其实就是在一个环中找一个最长的子环,并且这个子环是轴对称的。 从对称轴上一点出发,向两个方向运动可以正好满足题意,并且可以证明如果抽选择的子环不是对称的话,其一定不是最长的。 倍长原序列,在新序列中求所有区间最长回文子序列长度。 答案就等于所有长度为n的区间最长回文的长度 和 所有长度为n-1的区间最长回文的长度+1(在轴上的两点可不同) 中最大的那个。

Strawberry fields forever 1323

HDU --- 4745 Two Rabbits最长回文子序列 区间DP

HDU --- 4745 最长回文子序列 区间dp 题意: Long long ago, there lived two rabbits Tom and Jerry in the forest. On a sunny afternoon, they planned to play a game with some stones. There were n stones on the ground and they were arranged as...

AAAAAAAC的博客 247

HDU4745 Two Rabbits区间dp

Two RabbitsLong long ago, there lived two rabbits Tom and Jerry in the forest. On a sunny afternoon, they planned to play a game with some stones. There were n stones on the ground and they were arrang

ZYL的博客 378
上一篇: Codeforces Beta Round #2 A B C
下一篇: 最长回文子串 HDU3068 POJ3974 CF.7D
hcbbt
博客等级 码龄14年 1143粉丝 392原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值