最长递增子序列

来源:互联网 发布:网络二哥是什么意思 编辑:程序博客网 时间:2024/06/05 07:28
#include<stdio.h>int data[100005],big[100005],len,n;int main(){    int i,j,k,mid;    while(~scanf("%d",&n))    {        for(i=0; i<n; i++)            scanf("%d",&data[i]);        big[0]=data[0];//将递增长度为i的值不断的减小,数组依然满足递增,若是大于最大值,则将添加更新最长递增子序列        for(len=i=1; i<n; i++)        {            if(big[0]>data[i])            {                big[0]=data[i];                continue;            }            else if(big[len-1]<data[i])            {                big[len++]=data[i];                continue;            } //二分查找            j=0;            k=len-1;            while(j<k)            {                mid=(j+k)/2;                if(data[i]>big[mid])j=mid+1;                else if(data[i]<big[mid])k=mid-1;                else break;            }            if(big[j]>=data[i])big[j]=data[i];            else if(data[i]<=big[k])big[k]=data[i];            else if(data[i]>big[k]){                big[k+1]=data[i];            }        }        printf("%d\n",len);    }    return 0;}

原创粉丝点击