求最长上升子序列

来源:互联网 发布:get it beauty self 编辑:程序博客网 时间:2024/05/22 15:31

求最长上升子序列的LIS算法
(nlogn)
主要思想就是开一个数组用来记录当长度为len时的最小的数a[i]
由于d数组是从小到大排列的,所以可以用二分法

//sort LIS#include<cstdio>#include<iostream>#include<cstring>#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const int T=100001;int n,len=1;int a[T],d[T];int erfen(int x){    int l=1,r=len,mid;    while(l<=r)    {        mid=(l+r)>>1;        if(d[mid-1]<x && x<=d[mid]) return mid;        else if(x>d[mid]) l=mid+1;        else r=mid-1;    }}int main(){    int i,j,k;    scanf("%d",&n);    fo(i,1,n) scanf("%d",&a[i]);    d[1]=a[1];    fo(i,2,n)    {        if(a[i]>d[len]) j=++len;        else if(a[i]<d[1]) j=1;        else j=erfen(a[i]);        d[j]=a[i];    }    printf("%d\n",len);    return 0;}
1 0