LIS最长上升子序列模板

来源:互联网 发布:mysql存放byteImage 编辑:程序博客网 时间:2024/05/17 04:42

O(n^2)的方法:

#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>using namespace std; int a[15010],dp[15010];int n; inline void ir(){    cin>>n;    return;} int main(){    ir();         int maxn=0;    for(int i=1;i<=n;i++)dp[i]=1;         for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);        for(int j=1;j<i;j++)            if(a[j]<a[i])               dp[i]=max(dp[i],dp[j]+1);        maxn=max(maxn,dp[i]);    }    cout<<maxn;    return 0;}
O(n log n)的方法:

#include <cstdio>#include <algorithm>using namespace std; int n,a[20010];int c[20010];int len=0; int find(int x){    int l=1,r=len,mid;    while(l<=r)    {        mid=(l+r)>>1;        if(x>c[mid])l=mid+1;        //记忆方法:求上升序列,就表示x更大,那么就是大于        else r=mid-1;    }    return l;} int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)scanf("%d",&a[i]);     for(int i=1;i<=n;i++)    {        int k=find(a[i]);        c[k]=a[i];        len=max(len,k);    }    printf("%d",len);    return 0;}

注:第一种可以找出序列本身,第二种只能找出其个数

1 0