最长不下降子序列的优化
最长不下降子序列有两种解法,分别为 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的长度即为最长的子序列长度