LPS HDOJ 4745 Two Rabbits

题目传送门

 1 /*
 2     题意:一只兔子顺时针跳,另一只逆时针跳,跳石头权值相等而且不能越过起点
 3     LPS:这道就是LPS的应用,把环倍增成链,套一下LPS,然而并不能理解dp[i][i+n-2] + 1,看别人的解题报告吧,以后来补(玩游戏)
 4   详细解释 5 */
 6 /************************************************
 7 * Author        :Running_Time
 8 * Created Time  :2015-8-8 16:57:23
 9 * File Name     :HDOJ_4747_LPS.cpp
10  ************************************************/
11
12 #include <cstdio>
13 #include <algorithm>
14 #include <iostream>
15 #include <sstream>
16 #include <cstring>
17 #include <cmath>
18 #include <string>
19 #include <vector>
20 #include <queue>
21 #include <deque>
22 #include <stack>
23 #include <list>
24 #include <map>
25 #include <set>
26 #include <bitset>
27 #include <cstdlib>
28 #include <ctime>
29 using namespace std;
30
31 #define lson l, mid, rt << 1
32 #define rson mid + 1, r, rt << 1 | 1
33 typedef long long ll;
34 const int MAXN = 2e3 + 10;
35 const int INF = 0x3f3f3f3f;
36 const int MOD = 1e9 + 7;
37 int a[MAXN], dp[MAXN][MAXN];
38
39
40 int main(void)    {     //HDOJ 4745 Two Rabbits
41     int n;
42     while (scanf ("%d", &n) == 1)   {
43         if (!n) break;
44         for (int i=1; i<=n; ++i)    {
45             scanf ("%d", &a[i]);
46             a[i+n] = a[i];
47         }
48         memset (dp, 0, sizeof (dp));
49         for (int i=1; i<=2*n; ++i)  dp[i][i] = 1;
50         for (int i=2; i<2*n; ++i)    {
51             for (int j=1; j+i-1<=2*n; ++j)    {
52                 if (a[j] == a[j+i-1]) dp[j][j+i-1] = dp[j+1][j+i-2] + 2;
53                 else    {
54                     dp[j][j+i-1] = max (dp[j+1][j+i-1], dp[j][j+i-2]);
55                 }
56             }
57         }
58         int ans = 0;
59         for (int i=1; i<=n; ++i)    {
60             ans = max (ans, dp[i][i+n-1]);
61             ans = max (ans, dp[i][i+n-2] + 1);
62         }
63         printf ("%d\n", ans);
64     }
65
66     return 0;
67 }
时间: 2024-10-12 20:30:19

LPS HDOJ 4745 Two Rabbits的相关文章

HDOJ 4745 Two Rabbits DP

Two Rabbits Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 944    Accepted Submission(s): 496 Problem Description Long long ago, there lived two rabbits Tom and Jerry in the forest. On a sunn

模拟 HDOJ 4552 Running Rabbits

题目传送门 1 /* 2 模拟:看懂题意,主要是碰壁后的转向,笔误2次 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <vector> 8 using namespace std; 9 10 const int MAXN = 1e3 + 10; 11 const int INF = 0x3f3f3f3f; 12 struct Rabbit 13

HDU 4745 Two Rabbits(DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意:n个数排成一个环.两个人AB初始时各自选定一个位置.每一轮A在顺时针方向选择一个位置,B在逆时针选择一个位置,且这两个人所选位置的数字相等,然后格子跳到新选的位置上.问最多进行多少轮?有一个限制为每次跳跃不能跨过以前自己曾经选过的格子. 思路:主要是分析问题的本质.其实就是求最长回文子列.f[i][j]为[i,j]的最长回文子列,则答案为max(f[1][i],f[i+1][n]). i

HDU 4745 Two Rabbits(最长回文子序列)

http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意: 有一个环,现在有两只兔子各从一个点开始起跳,一个沿顺时针,另一个沿逆时针,只能在一圈之内跳,并且每次所在的点的大小必须相同,问最多能经过 几个点. 思路:环状的话可以先倍增改成链. 这道题目的话就是求最长回文子串,它的求法是这样的: 设字符串为str,长度为n,p[i][j]表示第i到第j个字符间的子序列的个数(i<=j),则: 状态初始条件:dp[i][i]=1 (i=0:n-1) 状态转移方

hdu 4745 Two Rabbits 最长回文子序列

 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 arranged as a clockwise ring. That is to say, the f

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

SubmitStatus 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 arranged as a clockwise ring. That is to

HDU ACM 4745 Two Rabbits 最长非连续回文子序列

分析:两个不同方向开始跳跃,跳过数字相同,就相当于求回文子序列了.用dp求出从一个位置到另一个位置的最长回文子序列,相当于把[1-n]分成区间[1-x]和[x+1,n],结果就是两区间最长回文串子序列之和.枚举中间点i,求出max(dp[1,i]+dp[i+1,n])即得最终结果,回文非连续序列,从前往后,从后往前序列相同,求出区间内最长回文序列,由于是环,分成两部分,1~i,i+1~n,A可从i走到1,然后从n走到i+1,B可从1走到i,从i+1走到n . #include<iostream>

HDU 4745 Two Rabbits (区间DP)

题意: 两只兔子,在一个由n块石头围成的环上跳跃,每块石头有一个权值ai.开始时两兔站在同一石头上(也算跳1次),一只从左往右跳,一只从右往左跳,两只同时跳,而每跳一次,两只兔子所站的石头的权值都要相等,在一圈内(各自不能越过起点,也不能再次回到起点)它们(单只兔子)最多能跳多少次(1 <= n <= 1000, 1 <= ai <= 1000). 思路: 此题要求的就是最长回文子序列(并不是子串),而最长回文子序列的算法复杂度为O(n*n).但是由于是个环上,所以要挖掘一下环的性

HDU 4745 Two Rabbits (区间DP)

题意:给定一个圆形的环,有两个只兔子,一只顺时针跳,一个逆时针,但每次跳到的石头必须一样,问你最多能跳多少轮. 析:本来以为是LCS呢,把那个序列看成一个回文,然后就能做了,但是时间受不了.其实是一个区间DP,dp[i[j] 表示从 i 到 j 中最长的回文数. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #in