这道题刚开始想的比较复杂,后来发现序列所选取的第一个元素加上之后的最长上升和下降子序列即为最长的序列。只要dp一遍就行了,复杂度为O(n^2)。
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define M 2010
int a[M],n;
int dp1[M],dp2[M];
int main()
{
freopen("in.txt","r",stdin);
int T;
cin>>T;
while(T--)
{
cin>>n;
if(n==0)
{
cout<<0<<endl;
continue;
}
for(int i=0;i<n;i++) cin>>a[i];
dp1[n-1]=dp2[n-1]=0;
int ans=1;
for(int i=n-2;i>=0;i--)
{
dp1[i]=dp2[i]=0;
for(int j=i+1;j<n;j++)
{
if(a[i]>a[j]) dp1[i]=max(dp1[i],dp1[j]+1);
if(a[i]<a[j]) dp2[i]=max(dp2[i],dp2[j]+1);
}
ans=max(ans,dp1[i]+dp2[i]+1);
}
cout<<ans<<endl;
}
return 0;
}