题目是求最长回文子序列的长度,不过其区间的选取是有点讲究的。

首先把源串复制一遍,放在后面以解决循环的问题。随后用动态规划求其最长回文子序列。这里不能直接把最大值求出来就完事,题目要求了不能走重复的路,换言之,其区间窗口最长只能为n。

一开始我以为只要把最大值求出来和n取min就好,之后发现这个最大值不一定能满足不走重复路的约定,所以我们在查找区间的时候,要控制区间长度。取dp[i][i+n-1]这还没完,比如1213这种数据,可以从3开始最后跳到2,回文串为1213121,如果用n去控制则会输出3下,显然不对。究其原因,是回文串的中心位可以为一个单独的数,所以其长度有奇偶之分,所以窗口大小也要能同时处理奇偶,这里就可以用dp[i][i+n-2]+1了将dp窗口-1,那减去的一位作为起跳点。

直接上代码吧。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
int s1[2005];
int dp[2005][2005];int main()
{int n;while(cin>>n){if(n==0)break;for(int i=0;i<n;i++){cin>>s1[i],s1[i+n]=s1[i];}for(int i=0;i<n*2;i++)for(int j=0;j<n*2;j++)dp[i][j]=(i==j);int mx=1;for(int i=n*2-1;i>=0;i--){for(int j=i+1;j<n*2;j++){if(i<j){if(s1[i]==s1[j])dp[i][j]=dp[i+1][j-1]+2;elsedp[i][j]=max(dp[i+1][j],dp[i][j-1]);}}}int ans=0;for(int i=0;i<n;i++){ans=max(ans,dp[i][i+n-1]);ans=max(ans,dp[i][i+n-2]+1);}cout<<ans<<endl;}return 0;
}

转载于:https://www.cnblogs.com/LukeStepByStep/p/6696343.html

hdu-4745 Two Rabbits相关推荐

  1. HDU 4745 Two Rabbits——最长回文子串

    这道题实际上是求一个序列的最长回文子串的长度,关于最长回文子串请看http://blog.csdn.net/hao_zong_yin/article/details/72730732 这道题的特殊性就 ...

  2. HDU 4745 Two Rabbits(区间dp)

    这道题相对来说,我觉得就有点考查读题了 读题时一定要细心,大致就是要你求一个回文子序列,递推方程很简单 if(a[i]==a[j]) g[i][j]=max(g[i][j],g[i+1][j-1]+2 ...

  3. [模拟] hdu 4452 Running Rabbits

    意甲冠军: 两个人在一个人(1,1),一个人(N,N) 要人人搬家每秒的速度v.而一个s代表移动s左转方向秒 特别值得注意的是假设壁,反弹.改变方向 例如,在(1,1),采取的一个步骤,以左(1,0) ...

  4. hdu 4745 区间dp

    题意:求一个环的最长回文序列,是序列不是串 链接:点我 起点是可以任意的, 所以只要求出每个区间的最长回文序列之后取max(dp[1][i]+dp[i+1][n]),即可得最终答案 本来是想扩展两倍的 ...

  5. 动态规划总结与题目分类

    源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...

  6. 『ACM-算法-动态规划』初识DP动态规划算法

    一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...

  7. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  8. 《动态规划》— 动态规划分类

    动态规划(英语:Dynamic programming,DP)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最 ...

  9. 转:动态规划题目分类

    https://blog.csdn.net/cc_again/article/details/25866971 一.简单基础dp 这类dp主要是一些状态比较容易表示,转移方程比较好想,问题比较基本常见 ...

  10. 【DP专辑】ACM动态规划总结

    转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 ...

最新文章

  1. mysql5.7 cmake源码编译安装
  2. notepad++ 设置常用快捷键
  3. Spring Data JPA 查询方法支持的关键字
  4. 【Clion-Ubuntu-dlib】运行一个dlib案例(一)(如何在clion编译器中配置CMakeLists)
  5. switch变量的作用 域问题
  6. mybatisplus 操作另一个数据库的数据_MySQL的数据库操作详解
  7. pytorch学习笔记(二十七):Batch-Norm
  8. spring.profiles.active和spring.profiles.include的使用与区别
  9. 在同一台服务器上配置多个Tomcat
  10. secureCRT下载地址,亲测有效
  11. Keil MDK5 破解
  12. MATLAB 排序函数(先按第一列排序(主排序)然后再按第二列排序(次排序))
  13. JAVA小项目-搜搜移动大厅
  14. 微信小程序链接wifi
  15. 易生活(二)-APP—安卓中评论功能的实现
  16. js bind 传参、_Node.js 在微医的应用场景及实践
  17. 上传声音 微信小程序_微信小程序之----audio音频播放
  18. 幂指函数的极限运算法则
  19. 由俭入奢易,由奢入俭难
  20. 陪玩源码,根据用户需求和功能开发搭建

热门文章

  1. 材料模拟计算超算云平台上线,发布会推出两项优惠政策
  2. 刷题笔记之十 (小易的升级之路+找出字符串中第一个只出现一次的字符+洗牌+MP3光标位置)
  3. 《信息安全工程师教程》学习笔记01(第一章)
  4. Node.js运行app.js时候报错933
  5. 用C++编写函数,分别用非递归和递归计算 Lucas 数列第 n 项
  6. 强化学习(1)-介绍
  7. 监听qq新邮件 linux,linux如何使用QQmail实现网络邮件报警?
  8. MYSQL JDBC图书管理系统
  9. Windows 8 和 Office 15 截图泄漏(多图)
  10. clang vectorization