笔记——最长上升子序列

int bSearch(int num,int k)//返回可更新的位置,如  1 3 4 ,2->1 2 4 将k长度的上升子序列的尾巴更新到最小
{
    int low=1,high=k;
    while(low<=high)
    {
        int mid=(low+high)/2;
        if(num>=p[mid])
        low=mid+1;
        else
        high=mid-1;
    }
    return low;
}
int LIS(int n)
{
    int low=1,high=n;
    int k=1;
    for(int i=2;i<=n;++i)
    {
        if(p[i]>p[k])//若p[i]>p[k],上升子序列长度加1,p[i]变成尾巴
        p[++k]=p[i];
        else//若不是,则更新某一长度的尾巴
        {
            int pos=bSearch(p[i],k);
            p[pos]=p[i];
        }
    }
    return k;
}
展开阅读全文

没有更多推荐了,返回首页