NlogN最长上升子序列

NlogN最长上升子序列

首先感谢newuser大佬的耐心解说

其次放一篇解说非常详尽的博客

概括着来说,就是开一个数组f,f[i]表示长度为i的最长上升子序列的末尾的最小数字(使得后面能够选到的更大的数字尽可能多)。而正由于f[i]表示的是最小末尾,所以f数组是单调的(至于是否严格单调就要看题目要求了)。有了单调这个性质,就可以通过二分查找(或lower_bound)来找里面的数字。具体看代码:

//这是单调不下降子序列
int Find(){
    //输入数列A[i],长度为n 
    int len=0;f[++len]=A[1];
    for(int i=2;i<=n;i++)
        if(f[len]<=A[i])f[++len]=A[i];//如果是严格单调就是<
        else{
            int k=lower_bound(f+1,f+len+1,A[i])-f;
            f[k]=A[i];//f[k]一定大于等于A[i]
        }
    return len;//最长上升公共子序列的长度 
}

猜你喜欢

转载自blog.csdn.net/arliastark/article/details/80370568