思路:求出以i结尾的递增序列长度和以i开始的最长递减序列长度,然后便历一遍就OK
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
const int inf=0x3f3f3f3f;
typedef long long ll;
struct LIS
{
int n,s[maxn];
void init(){n=0;}
int find(int x){return lower_bound(s,s+n,x)-s;}
void modify(int pos,int val){s[pos]=val;n=max(n,pos+1);}
}in,de;
int n,a[maxn];
int f[maxn],g[maxn];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
in.init();
for(int i=1;i<=n;i++)
{
f[i]=in.find(a[i]);
in.modify(f[i],a[i]);
f[i]+=1;
}
de.init();
for(int i=n;i>=1;i--)
{
g[i]=de.find(a[i]);
de.modify(g[i],a[i]);
g[i]+=1;
}
int ans=0;
for(int i=1;i<=n;i++)
{
int t=min(f[i],g[i]);
ans=max(ans,t);
}
printf("%d\n",ans*2-1);
}
return 0;
}