Wavio Sequence UVA - 10534


题解:dp[ i ]表示以a[ i ]为末尾的上升子序列。然后顺序跑一遍LIS,逆序跑一遍LIS。不要用O(n*n)的算法

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 using namespace std;
 6 
 7 const int INF=1e8;
 8 const int maxn=10005;
 9 
10 int n;
11 int a[maxn],b[maxn],dp1[maxn],dp2[maxn];
12 
13 void Inite(){
14     memset(dp1,0,sizeof(dp1));
15     memset(dp2,0,sizeof(dp2));
16 }
17 
18 void solve(){
19     for(int i=0;i<=n;i++) b[i]=INF;
20     for(int i=0;i<n;i++){
21         dp1[i]=lower_bound(b,b+n,a[i])-b;         //书上的写法是 *lower_bound(dp,dp+n,a[i])=a[i];
22         b[dp1[i]]=min(b[dp1[i]],a[i]);            //相同的思想,只是稍微改一下!!!!
23     }
24     
25     for(int i=0;i<=n;i++) b[i]=INF;
26     for(int i=n-1;i>=0;i--){
27         dp2[i]=lower_bound(b,b+n,a[i])-b;
28         b[dp2[i]]=min(b[dp2[i]],a[i]);
29     }
30     
31     int ans=0;
32     for(int i=0;i<n;i++) ans=max(ans,min(dp1[i],dp2[i]));
33     ans=2*ans+1;
34     cout<<ans<<endl;
35 }
36 
37 int main()
38 {    while(scanf("%d",&n)!=EOF){
39         for(int i=0;i<n;i++) scanf("%d",&a[i]);
40         Inite();
41         solve();
42     }
43     return 0;
44 }

 

posted @ 2017-09-02 22:13  天之道,利而不害  阅读(110)  评论(0)    收藏  举报