笔记——最长上升子序列(LIS)

来源:互联网 发布:学配音的软件 编辑:程序博客网 时间:2024/06/06 01:36
/*最长上升子序列LIS
*/
int bSearch(int num,int k)//利用二分法将num替换到b[]中,使得b[]中1到最长子序列的末尾数字最小
{  
    int low=1,high=k;  
    while(low<=high)  
    { 
        int mid=(low+high)/2;  
        if(num>=b[mid])  
        low=mid+1;  
        else
        high=mid-1;  
    }
    return low;  
}
int LIS(int n)
{
    int low=1,high=n;
    int k=1;
    b[1]=a[1];
    for(int i=2;i<=n;++i)//b[x]为在1-i中,x长度的子序列末尾最小的数
    {
        if(a[i]>b[k])
        b[++k]=a[i];
        else
        {
            int pos=bSearch(a[i],k);
            b[pos]=a[i];
        }
    }