此题的意思是给出一个数字序列,让你求最长的子序列,满足:
前n+1个是升序,后n+1个是降序。(总长为2n+1)
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
思路:对于每个数,求他前边的数和他构成的最长升序个数t1,和他和他后边的数构成的最长降序个数t2。
由此,依次比较每一个数的(min(t1,t2)*2-1) ,即最长的升降序列,最大的那个数就是结果。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define MAXN 10005
#define INF 1000000;
int a[MAXN],t1[MAXN],t2[MAXN],s[MAXN],n;
int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
s[i]=INF;
int p=lower_bound(s+1,s+1+i,a[i])-s;
t1[i]=p;
s[p]=a[i];
}
for(int i=n;i>=1;i--){
s[n-i+1]=INF;
int p=lower_bound(s+1,s+1+n-i+1,a[i])-s;
t2[i]=p;
s[p]=a[i];
}
int maxx=0;
for(int i=1;i<=n;i++){
int temp=min(t1[i],t2[i])*2-1;
if(temp>maxx) maxx=temp;
}
cout<<maxx<<endl;
}
return 0;
}