题目大意:
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;
}