筆記——最長上升子序列

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章