最长不下降子序列的优化

最长不下降子序列有两种解法,分别为 O(n^2) 和O(n logn)

第一种就是普通的dp方法,这里不再写了;

 

主要记录一下n logn的写法

 

主要思路: 用一个数组 b 来记录最长的子序列;  一开始让b[ 1 ]=a[ 1 ] (数组a为输入的一个序列) ,从i=2开始循环,如果a[ i ] 大于了当前的这个 b 数组的末尾元素,直接让b在后面加上这个a[ i ]即可,如果不大于,那么查找b数组的元素,找到第一个大于a[ i ]的那个元素,让a[ i ]顶替它,此后一直这样维护数组b,最后b的长度就是最长不下降子序列的长度;

 

//用数组b来记录这个最长的子序列
//a是输入的序列
b[1]=a[1]; 
len =1;
    for (i=2;i<=n;++i)
    {
        if (a[i]>=b[len])   //如果a[i]大于b的末尾元素直接在b后面加上a[i]
            b[++len]=a[i];
        else
        {
            t=upper_bound( b+1 , b+len+1 , a[i] )-b; //寻找b数组中第一个大于a[i]的下标
            b[t]=a[i];
        }
    }
//最后len的长度即为最长的子序列长度

 

posted @ 2019-07-11 20:04  blowhail  阅读(743)  评论(0编辑  收藏  举报
Live2D