zoukankan      html  css  js  c++  java
  • 最长不下降子序列的优化

    最长不下降子序列有两种解法,分别为 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的长度即为最长的子序列长度
  • 相关阅读:
    mysql 存储过程 异常处理机制
    Maven 私服打包
    Flink(2):Flink的Source源
    Flink(1):Flink的基础案例
    最后一课
    我的获奖记录及 Important Dates in OI
    目录
    入坑 OI 三周年之际的一些感想
    洛谷 P3781
    Atcoder Typical DP Contest S
  • 原文地址:https://www.cnblogs.com/blowhail/p/11172338.html
Copyright © 2011-2022 走看看