DP - 最長上升子序列(nlogn模板) - Wavio Sequence - UVA - 10534
題意:
舉例:
1 2 3 2 1 2 3 4 3 2 1 5 4 1 2 3 2 2 1
the longest Wavio sequence is : 1 2 3 4 5 4 3 2 1
Sample Input:
10
1 2 3 4 5 4 3 2 1 10
19
1 2 3 2 1 2 3 4 3 2 1 5 4 1 2 3 2 2 1
5
1 2 3 4 5
Sample Output:
9
9
1
數據範圍:
分析:
與——《DP - 最長上升子序列模型 - NOIP2004提高組 - 合唱隊形 + 北京大學ACM/ICPC選拔賽 - 登山》類似。
需要注意的是:
代碼:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=10010;
int n,a[N],f1[N],f2[N];
int main()
{
while(~scanf("%d",&n))
{
memset(f1,0,sizeof f1);
memset(f2,0,sizeof f2);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int q[N];
q[0]=-1e9;int len=0;
for(int i=1;i<=n;i++)
{
int l=0,r=len;
while(l<r)
{
int mid=l+r+1>>1;
if(q[mid]<a[i]) l=mid;
else r=mid-1;
}
len=max(len,r+1);
f1[i]=r+1;
q[r+1]=a[i];
}
memset(q,0,sizeof q);
q[0]=-1e9;len=0;
for(int i=n;i;i--)
{
int l=0,r=len;
while(l<r)
{
int mid=l+r+1>>1;
if(q[mid]<a[i]) l=mid;
else r=mid-1;
}
len=max(len,r+1);
f2[i]=r+1;
q[r+1]=a[i];
}
int res=1;
for(int i=1;i<=n;i++) res=max(res,min(f1[i],f2[i]));
printf("%d\n",2*res-1);
}
return 0;
}