题意:
给出n个人的身高,求这些人中连续的且满足对称、从做到中心递增的最大人数。
题解:
很明显,想到将序列倒序,然后两个串进行匹配最大上升公共子序列
注意两点:
一、像这样的23232 最长是3个人,所以匹配的二维循环中j最大不能超过n-i+1;
二、要单独判断奇数偶数的匹配,否则奇数匹配结果会多1;
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
//typedef __int64 lld;
#define oo 0x3f3f3f3f
#define Mod 1000000007
#define maxn 202
int dp[maxn];
int a[maxn],b[maxn];
int main()
{
int T,n,ans;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ans=0;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
b[i]=a[n-i+1];
memset(dp,0,sizeof dp);
for(int i=1;i<=n;i++)
{
int k=0;
for(int j=1;j<=n-i+1;j++)
{
if(a[i]>b[j]&&dp[k]<dp[j])
k=j;
if(a[i]==b[j])
{
if(j==(n-i+1))
dp[j]=max(dp[k]+1,dp[j]);
else
dp[j]=max(dp[k]+2,dp[j]);
}
ans=max(dp[j],ans);
}
}
printf("%d\n",ans);
}
return 0;
}