题意:

  两只兔子,在一个由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)的更多相关文章

  1. hdu 4745 Two Rabbits 区间DP

    http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意: 有两只兔子Tom Jerry, 他们在一个用石头围城的环形的路上跳, Tom只能顺时针跳,Jerr ...

  2. HDU 4745 Two Rabbits 区间dp_回文序列

    题目链接: http://blog.csdn.net/scnu_jiechao/article/details/11759333 Two Rabbits Time Limit: 10000/5000 ...

  3. HDU 4745 Two Rabbits(区间DP,最长非连续回文子串)

    Two Rabbits Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total ...

  4. HDU 5115 Dire Wolf 区间dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 Dire Wolf Time Limit: 5000/5000 MS (Java/Others ...

  5. HDU 5693 D Game 区间dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5693 题解: 一种朴实的想法是枚举选择可以删除的两个或三个数(其他的大于三的数都能凑成2和3的和), ...

  6. hdu 4597 Play Game 区间dp

    Play Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=459 ...

  7. hdu 5693 && LightOj 1422 区间DP

    hdu 5693 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5693 等差数列当划分细了后只用比较2个或者3个数就可以了,因为大于3的数都可以由2和3 ...

  8. hdu 5181 numbers——思路+区间DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5181 题解:https://www.cnblogs.com/Miracevin/p/10960717.ht ...

  9. HDU 1141---Brackets Sequence(区间DP)

    题目链接 http://poj.org/problem?id=1141 Description Let us define a regular brackets sequence in the fol ...

  10. HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)

    题目 参考自博客:http://blog.csdn.net/u011498819/article/details/38356675 题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. ...

随机推荐

  1. JSONCPP开发环境搭建

    环境设置 项目地址 https://github.com/open-source-parsers/jsoncpp.git 操作系统 64位 Fedora 24 安装jsoncpp $ git clon ...

  2. JS中的参数搜寻机制

    1: var color="blue"; function changecolor(color){ if(color=="blue"){ color=" ...

  3. Flask-SQLAlchemy 配置,处理对象-关系,一对多,多对多

      ORM(Object Relational Mapper) 对象关系映射.指将面对对象得方法映射到数据库中的关系对象中. Flask-SQLAlchemy是一个Flask扩展,能够支持多种数据库后 ...

  4. PAT 1043【BST与二叉树】

    考察: 1.二叉树的建树 2.前序遍历,后序遍历 3.BST的特性 这题的思路: 告诉你数组是先序遍历的,so 根已经知道了(数组首位元素),那么按照BST,建一下树(要两次,另外一次是镜像的): 跑 ...

  5. 需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数 及 多属性节点查询

    第一个问题, 1. 首先需要引入命名空间, 2. 其次,在用xpath查找结点时,在selectNodes等方法中再次带入命名空间 如 XmlDocument doc = new XmlDocumen ...

  6. not null 非空约束

    例子:create table tb1(     id int,     name varchar(20) not null); 注意  空字符不等于null #手动,添加非空约束 (必须这个字段,没 ...

  7. php与MySQL与echart综合使用

    http://www.yinghualuowu.com/php/echart.html 创建table sex 有name num             <?php ini_set('disp ...

  8. NIO2

    Files工具包下包含创建临时文件, 文件copy, move等API Path tempFile = Files.createTempFile(null, ".tmp"); // ...

  9. Ubuntu搜狗输入法乱码情况

    cd ~/.config sudo rm -rf SogouPY* sogou*

  10. 030 Substring with Concatenation of All Words 与所有单词相关联的字串

    给定一个字符串 s 和一些长度相同的单词 words,找出 s 与 words 中所有单词(words 每个单词只出现一次)串联一起(words中组成串联串的单词的顺序随意)的字符串匹配的所有起始索引 ...