HDU 4745 Two Rabbits (区间DP)
题意:
两只兔子,在一个由n块石头围成的环上跳跃,每块石头有一个权值ai。开始时两兔站在同一石头上(也算跳1次),一只从左往右跳,一只从右往左跳,两只同时跳,而每跳一次,两只兔子所站的石头的权值都要相等,在一圈内(各自不能越过起点,也不能再次回到起点)它们(单只兔子)最多能跳多少次(1 <= n <= 1000, 1 <= ai <= 1000)。
思路:
此题要求的就是最长回文子序列(并不是子串),而最长回文子序列的算法复杂度为O(n*n)。但是由于是个环上,所以要挖掘一下环的性质。
假设两只兔子跳的是序列,而不是环,那么他们是这样跳的4<-3<-2<-1->2->3->4,一共跳了4次,颜色的不同代表了不同的兔子,那么现在将这个序列接起来,就是4321234的环了,在环上他们跳的次数是7次。可以发现其中一只兔子跳了1->2->3->4->4->3->2,而另一只是逆着跳而已。观察一下,其实算2->3->4就行了,下一段肯定是一个逆的过程(另一兔子所跳的)。那么就只需要算一个序列的最长回文子序列啦。注意起点必须是两只一块站着,所以这种情况下必定是个奇数。
如果序列并不是这样的呢?比如12213443,在序列中的某一处断开了,变成两段回文,由于是个环,所以是两段的最长回文子序列之和。枚举一下断开处就行了,注意只需要一个起点,即只要有一段是个奇数就行了。
注:这道题这样提交的话是WA的,但是代码是没有错的。而起点算两次的代码却可以AC。
WA的正确代码:
#include <bits/stdc++.h>
using namespace std;
const int N=;
int a[N], dp[N][N], n; int main( )
{
freopen("input.txt","r",stdin);
while(scanf("%d",&n), n)
{
memset(dp,,sizeof(dp));
for(int i=; i<=n; i++)
{
scanf("%d", &a[i]);
dp[i][i]=;
}
for(int j=; j<=n; j++)
{
for(int i=j-; i>; i--)
{
dp[i][j]=max(dp[i+][j], dp[i][j-]);
if(a[i]==a[j])
dp[i][j]=max(dp[i][j], dp[i+][j-]+);
}
}
int ans=;
for(int i=; i<=n; i++)
{
int tmp=dp[][i-]+dp[i][n];
if( dp[][i-]% || dp[i][n]% )
ans=max(ans, tmp);
else
ans=max(ans, tmp-);//两段都是偶数,必须减少1
}
cout<<ans<<endl;
}
return ;
}
WA代码
AC的错误代码:
#include <bits/stdc++.h>
using namespace std;
const int N=;
int a[N], dp[N][N]; int main( )
{
//freopen("input.txt","r",stdin);
int n;
while(scanf("%d",&n), n)
{
for(int i=; i<=n; i++) scanf("%d",&a[i]);
for(int i=; i<=n; i++) dp[i][i]=;
for(int j=; j<=n; j++)
{
for(int i=j-; i>; i--)
{
dp[i][j]=max(dp[i+][j],dp[i][j-]);
if(a[i]==a[j]) dp[i][j]=max(dp[i][j], dp[i+][j-]+);
}
}
int ans=;
for(int i=; i<=n; i++)
ans=max(ans, dp[][i-]+dp[i][n]);
cout<<ans<<endl;
}
return ;
}
AC代码
HDU 4745 Two Rabbits (区间DP)的更多相关文章
- hdu 4745 Two Rabbits 区间DP
http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意: 有两只兔子Tom Jerry, 他们在一个用石头围城的环形的路上跳, Tom只能顺时针跳,Jerr ...
- HDU 4745 Two Rabbits 区间dp_回文序列
题目链接: http://blog.csdn.net/scnu_jiechao/article/details/11759333 Two Rabbits Time Limit: 10000/5000 ...
- HDU 4745 Two Rabbits(区间DP,最长非连续回文子串)
Two Rabbits Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total ...
- HDU 5115 Dire Wolf 区间dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 Dire Wolf Time Limit: 5000/5000 MS (Java/Others ...
- HDU 5693 D Game 区间dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5693 题解: 一种朴实的想法是枚举选择可以删除的两个或三个数(其他的大于三的数都能凑成2和3的和), ...
- hdu 4597 Play Game 区间dp
Play Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=459 ...
- hdu 5693 && LightOj 1422 区间DP
hdu 5693 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5693 等差数列当划分细了后只用比较2个或者3个数就可以了,因为大于3的数都可以由2和3 ...
- hdu 5181 numbers——思路+区间DP
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5181 题解:https://www.cnblogs.com/Miracevin/p/10960717.ht ...
- HDU 1141---Brackets Sequence(区间DP)
题目链接 http://poj.org/problem?id=1141 Description Let us define a regular brackets sequence in the fol ...
- HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)
题目 参考自博客:http://blog.csdn.net/u011498819/article/details/38356675 题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. ...
随机推荐
- HN669打包工具--游戏对接
一. 将游戏工程拖入到工具的HN669Ploy目录下,如下图: 二. xCode打开游戏工程,将Core目录下的HN669SDKCore工程添加入游戏工程,并引用库,如图: 三.调用API 1.A ...
- 复制或合并map
1.map之间实现复制或合并 { // Map 能像数组一样被复制: let original = new Map([ [1, 'tom'] ]); let clone = new Map(origi ...
- [Xcode 实际操作]三、视图控制器-(10)在Storyboard中使用图像视图控件
目录:[Swift]Xcode实际操作 本文将演示常用的图像视图控件在故事板中的使用. 打开故事板文件[Main.storyboard]点击选择视图控制器的根视图. 点击库图标,打开控件库面板. 在控 ...
- SP1716 GSS3
题意翻译 \(n\) 个数,\(q\) 次操作 操作\(0\) \(x\) \(y\)把\(A_x\) 修改为\(y\) 操作\(1\) \(l\) \(r\)询问区间\([l, r]\)的最大子段和 ...
- Django反向解析与分组命名
1.图书管理系统中使用分组或命名分组.URL的命名和反向解析: 2.删除功能三合一: urls.py文件 from app_book import views urlpatterns = [ url( ...
- Python 简单的方法爬取b站dnf视频封面
import urllib.request cnt=0 def instr(keystr): st=keystr.find('(')+1 strhtml=keystr[st:len(keystr)-1 ...
- 2017年江西理工大学C语言程序设计竞赛(高级组)
问题 A: 求近似值 #include <stdio.h> #include <time.h> #include <stdlib.h> using namespac ...
- PHP根据经纬度计算距离
思路: 公式: W为纬度对应的弧度,J为经度对应的弧度,如上图所示 下面代码 lat是纬度 lng是经度 /** * 根据经纬度算距离,返回结果单位是公里,先纬度,后经度 * @param $la ...
- D. Beautiful numbers
题目链接:http://codeforces.com/problemset/problem/55/D D. Beautiful numbers time limit per test 4 second ...
- D - 稳住GCD DP
http://acm.uestc.edu.cn/#/problem/show/923 给定一堆数字,求其所有数字的gcd. 现在要删除最多的数字,使得剩下的数字的gcd和原来的一样. 设dp[i][v ...