最长上升子序列LIS

来源:互联网 发布:python except as 编辑:程序博客网 时间:2024/05/20 18:43

给定一列数,求最长上升子序列的长度。
O(n^2)的算法大家都会吧。这里介绍一种时间复杂度较低的算法(我也不会算时间复杂度,反正很低)。
我们可以维护一个单调。。。数组吧。若这个数比数组最后一个数大,将它加入数组,长度++;
else替换最早比它大的数。。
讲解就完了,上代码:

#include<algorithm>#include<iostream>#include<cstdio>using namespace std;int n,m,a[1005],b[1005];int bin(int x){    int l=1,r=m;    while(l<r)    {        int mid=(l+r)/2;        if(x<=b[mid])            r=mid;        else            l=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++)    {        if(a[i]>b[m])            b[++m]=a[i];        else        {            int pos=bin(a[i]);            b[pos]=a[i];        }    }    printf("%d\n",m);    return 0;}
0 0
原创粉丝点击