HDU 吉哥系列故事——完美队形II 騰訊馬拉松初賽第二輪D題

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

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 354    Accepted Submission(s): 99


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
 

 

Source
 

 

Recommend
liuyiding
 
分析:
  很多人都用擴展KMP,不懂。。。
  其實這題有一個很好的暴力思路。。。
  
  1.我們把連續相同的合併,然後算出該合併塊的大小。
  2.統計這k個合併塊的前驅和。
  3.“暴力”枚舉中間的最高點,然後向兩邊的合併塊擴展(按照題目給出的約束條件),注意若是兩邊的合併塊大小不一樣,就取最小的那塊,然後不能夠再往兩邊擴展。更新答案。
 
  算法複雜度:O(n)   !
  爲什麽?因為每兩個相鄰的合併塊都是不同元素的,肯定是一個嚴格單調的關係,所以我們每次枚舉中間點的時候,能夠往兩邊擴展的範圍很小。若是很大的話,那麼,我們其實就可以跳到上一次可以擴展到的最右位置了(因為上次的最高點到該位置都是滿足單調遞減的。。。)  
  
  注意的是:擴展的時候需要注意兩邊的合併塊的大小是否相同。代碼略。。。
  
7862855 2013-03-24 10:36:45 Accepted 4513 390MS 1100K 2939 B G++ yejinru
 
 
 
posted @ 2013-03-24 18:19  yejinru  阅读(297)  评论(0编辑  收藏  举报