LIS算法

LIS(Longest Increasing Subsequence)最长上升(不下降)子序列。

    1. O(n^2)

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 int n,ans;
 6 int a[10005],d[10005];
 7 
 8 int main(){
 9     scanf("%d",&n);
10     for(int i=1;i<=n;++i)scanf("%d",&a[i]);
11     for(int i=1;i<=n;++i){
12         d[i]=1;
13         for(int j=1;j<i;++j)
14             if(a[i]>a[j]&&d[i]+1>d[j])d[i]=d[j]+1;
15     }
16     for(int i=1;i<=n;++i)ans=max(ans,d[i]);
17     printf("%d",ans);
18     return 0;
19 } 

 

 

    2. O(n logn)

 

 1 #include<cstdio>
 2 int n;
 3 int a[10005];
 4 int stack[10005],top;
 5 
 6 int main(){
 7     scanf("%d",&n);
 8     for(int i=1;i<=n;++i)scanf("%d",&a[i]);
 9     stack[++top]=a[1];
10     for(int i=2;i<=n;++i){
11         if(a[i]>stack[top])stack[++top]=a[i];
12         else {
13             int l=1,r=top;
14             while(l<=r){
15                 int mid=l+r>>1;
16                 if(stack[mid]<a[i])l=mid+1;
17                 else r=mid-1;
18             }
19             stack[r]=a[i];
20         }
21     }
22     printf("%d",top);
23     return 0;
24 }

 

posted @ 2016-11-09 20:19  WJ-Ting  阅读(439)  评论(0编辑  收藏  举报