网上很多AC代码都是错的 用这组数据可测
10
2 2 2 2 1 2 2 2 3 3
正确答案是 10
大部分都是没有把正确的相同的去掉
http://www.cnblogs.com/woaishizhan/archive/2013/07/23/3209328.html这个人的代码还是比脚靠谱的, 但是还是通不过着个数据,做了些小改动后,代码如下,思路同上BOLG
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#include <iostream>
#define maxn 100010
using namespace std;
int val[maxn];
int N;
void DP(int num[],int dp[],int same[])
{
int i,j;
vector<int> v;
for(i=0;i<N;i++)
{
int a,b;
a=lower_bound(v.begin(),v.end(),num[i])-v.begin();
b=upper_bound(v.begin(),v.end(),num[i])-v.begin();
if(b==v.size())
{
v.push_back(num[i]);
dp[i]=v.size();
}
else
{
v[b]=num[i];
dp[i]=b+1;
}
same[i]=min(same[i],b-a+1);
//same[i] = b-a+1;
}
}
int dp1[maxn],dp2[maxn];
int same[maxn];
int main()
{
// freopen("input.txt","r",stdin);
int i,j;
int T;
scanf("%d",&T);
while(T--)
{
memset(same, 0x3f, sizeof(same));
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&val[i]);
}
reverse(val,val+N);
DP(val,dp1,same);
for(i=0;i<N;i++)
{
val[i]=-val[i];
}
DP(val,dp2,same);
int ans=0;
for(i=0;i<N;i++)
{
ans=max(ans,dp1[i]+dp2[i]-same[i]);
}
printf("%d\n",ans);
}
return 0;
}