吉哥系列故事——完美队形II

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)

Problem Description
吉哥又想出了一个新的完美队形游戏!
  假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形:

  1、挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的;
  2、左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然如果m是奇数,中间那个人可以任意;
  3、从左到中间那个人,身高需保证不下降,如果用H表示新队形的高度,则H[1] <= H[2] <= H[3] .... <= H[mid]。

  现在吉哥想知道:最多能选出多少人组成新的完美队形呢?

Input
输入数据第一行包含一个整数T,表示总共有T组测试数据(T <= 20);
  每组数据首先是一个整数n(1 <= n <= 100000),表示原先队形的人数,接下来一行输入n个整数,表示原队形从左到右站的人的身高(50 <= h <= 250,不排除特别矮小和高大的)。
Output
请输出能组成完美队形的最多人数,每组输出占一行。
Sample Input
2 3 51 52 51 4 51 52 52 51
Sample Output
3 4
解题思路:首先用manacher算法求出每个字符的回文半径,接下来就是如何求非递减的串了,这里可以用dp的思想,dp[i]表示以s[i]结尾的最长非递减子串。那么只需要比较dp[i]与r[i]/2的大小关系即可。总之还是比较容易想的。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 100005;
int n,H[maxn],c[maxn<<1];
int dp[maxn],r[maxn<<1];void Manacher()
{int id,maxlen;r[0] = 1;maxlen = 0;id = 0;for(int i = 1; i <= 2*n; i++){if(r[id] + id > i) r[i] = min(r[2*id-i],r[id] + id - i);else r[i] = 1;while(c[i - r[i]] == c[i + r[i]]) r[i]++;if(i + r[i] > maxlen){maxlen = i + r[i];id = i;}}
}int main()
{int t,id;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i = 1; i <= n; i++)scanf("%d",&H[i]);c[0] = -1;for(int i = 1; i <= n; i++){c[2*i] = 0;c[2*i-1] = H[i];}c[2*n] = -2;dp[1] = 1; for(int i = 2; i <= n; i++) //dp[i]表示以H[i]结尾的最长非递减子串{if(H[i] >= H[i-1])dp[i] = dp[i-1] + 1;else dp[i] = 1;}Manacher();int ans = 0;for(int i = 1; i <= 2*n; i++){if(i % 2 == 1){id = (i + 1) / 2;ans = max(ans,2 * min((r[i] + 1)/2,dp[id]) - 1);}else{id = i / 2;ans = max(ans,2 * min(r[i]/2,dp[id]));}}printf("%d\n",ans);}return 0;
}

hdu 4513(manacher+dp)相关推荐

  1. HDU 4513 吉哥系列故事――完美队形II(Manacher)

    题目链接:[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher V - 吉哥系列故事――完美队形II 题意 吉哥又想出了一个新的完美队形游戏! 假设有n个人 ...

  2. HDU - 4513 吉哥系列故事——完美队形II(Manacher)

    题目链接:点击查看 题目大意:给出一个长度为n的数列,现在要求选出一段连续的数列,满足: 该数列为回文串 该数列的左半部分非严格递增 输出选取数列的最大长度 题目分析:因为是要选取连续的子串,并且还需 ...

  3. hdu 5340(manacher+枚举)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5340 解题思路:首先用manacher处理每个字符,接下来就是要枚举了. 首先是我想到的dp,dp[i ...

  4. hdu 1520 树形dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 #include<cstdio> #include<cstring> # ...

  5. hdu 4035 可能性DP 成都网络游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=4035 获得: 1.首先推断是不是树.事实上,所有的感觉身影,既看边数==算-1是不成立 2.有时候,我告诉孩子来 ...

  6. HDU 2836 (离散化DP+区间优化)

    Reference:http://www.cnblogs.com/wuyiqi/archive/2012/03/28/2420916.html 题目链接: http://acm.hdu.edu.cn/ ...

  7. hdu 5568(dp+大数模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5568 官方题解: #include <cstdio> #include <cstri ...

  8. hdu 5464(简单dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5464 解题思路: 由于p很小,而ai很大,所以先把ai%p,由于ai可能有负数,所以ai=(ai%p+ ...

  9. hdu 5433(bfs+dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5433 解题思路: dp[i][j][k]表示在(x,y)点,毅力为k时的最小体力.由于每个点可能会走多 ...

最新文章

  1. 《卫报》长文解读机器的崛起:人类越来越无法掌控它们
  2. 第13天学习Java的笔记(类定义)
  3. C语言二分法在一个有序数组查找数的算法(附完整源码)
  4. ABAP方法的exporting类型参数,需要在方法实现最开始显式初始化么
  5. 如何在其他程序的窗口上创建按钮并使之能响应
  6. 块格式化上下文(Block Formatting Context,BFC)
  7. flutter 拖拽布局_使用Flutter模仿SOUL可任意拖动的悬浮按钮
  8. c++------------之---【虚函数和抽象基类的应用】
  9. REMIX 本地环境搭建指南
  10. apache运行CGI程序的配置
  11. Android中使用ShareSDK功能学习
  12. qt最大化和还原实现_Qt 窗口操作函数(置顶、全屏,最大化最小化按钮设置等)...
  13. 3dsMax7数据导出方法及存在问题
  14. 2021-07-20 诺瓦星云笔试复盘
  15. QT应用编程: 开发TCP网络调试助手
  16. 网站关键词优化技巧都有哪些?如何进行优化?
  17. [译] 超快速的分析器(一):优化扫描器
  18. 2020-09-15,小米笔试,java
  19. TabLayout的使用详解
  20. win10如何设置有线和无线同时上内网和外网?

热门文章

  1. 小时级部署,客户数上千,神策数据的私有化部署靠什么取胜?
  2. 大咖分享,带你洞悉畅销游戏背后的数字化运营落地实践
  3. 抢鲜体验:十一大行业 demo 全新上线!
  4. Android-静态代理模式
  5. 一个C#程序员学习微信小程序的笔记
  6. 面试宝典系列-PHP变量在内存中的存储方式
  7. linux的swap
  8. 在fedora23中安装virtualbox, 然后实现虚拟机irtualbox 或者 vmware 下的xp操作系统
  9. eclipse启动tomcat遇到404错误
  10. NFC能否成为“标配”?