hdu4512之完美队形

题目大意:
      吉哥这几天对队形比较感兴趣。
  有一天,有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]。

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

#include<stdio.h>
#define N210
inta[N],dp[N];
inline intmax(int a,int b){//比较函数,因为用的次数多,所以将其转化为内联函数
    returna>b?a:b;
}
void initi(intn){//初始化函数
    for(inti=0;i<n;i++)
             dp[i]=0;
}
intmain()
{
    intt;
   scanf("%d",&t);
    intn;
   while(t--&&scanf("%d",&n)){
          initi(n);intans=1;//ans用来记录完美队形
       for(inti=0;i<n;i++)
           scanf("%d",a+i);
       for(intj=n-1;j>=0;j--){//可以理解为c串
          int temp=0;        //temp可以理解为b串的递增子序列与c串的交集的最大值即可
          for(int i=0;i<=j;i++){ //可以理解为b串

             if(a[i]<a[j])temp=max(temp,dp[i]);//在相交串中当a[i]<a[j]时则dp[i+1]应该等于dp[i]+1;

                else if(a[i]==a[j])dp[i]=temp+1;//当相等的时候要更新dp[i]

               if(i<j)
                  ans=max(ans,2*dp[i]);//当i<j的时候是考虑中间没有多余的人
                 else
                   ans=max(ans,dp[i]*2-1);//当中间有人,即完美队形为奇数
          }
       }
      printf("%d\n",ans);
   }
    return0;

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值