最长上升子序列问题(LIS):

一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(子序列可以理解为:删除0个或多个,其它数的顺序不变)如:(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1,6,2,3,7,5),有它的一些上升子序列,如(1,2,3,5)或者(1,6,7)等等,但前者更长。

这题目是经典的DP题目,也可叫作LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。

分析:

如何把这个问题分解成子问题呢?经过分析,发现 “求以ak(k=1, 2, 3…N)为终点的最长上升子序列的长度”是个好的子问题――这里把一个上升子序列中最右边的那个数,称为该子序列的“终点”。虽然这个子问题和原问题形式上并不完全一样,但是只要这N个子问题都解决了,那么这N个子问题的解中,最大的那个就是整个问题的解。

由上所述的子问题只和一个变量相关,就是数字的位置。因此序列中数的位置k 就是“状态”,而状态 k 对应的“值”,就是以ak做为“终点”的最长上升子序列的长度。这个问题的状态一共有N个。状态定义出来后,转移方程就不难想了。假定MaxLen (k)表示以ak做为“终点”的最长上升子序列的长度,那么:

MaxLen (1) = 1

MaxLen (k) = Max { MaxLen (i):1<i < k 且 ai < ak且 k≠1 } + 1

这个状态转移方程的意思就是,MaxLen(k)的值,就是在ak左边,“终点”数值小于ak,且长度最大的那个上升子序列的长度再加1。因为ak左边任何“终点”小于ak的子序列,加上ak后就能形成一个更长的上升子序列。

实际实现的时候,可以不必编写递归函数,因为从 MaxLen(1)就能推算出MaxLen(2),有了MaxLen(1)和MaxLen(2)就能推算出MaxLen(3)……

代码随后贴出……

最长上升子序列问题 (LIS)相关推荐

  1. [51Nod 1218] 最长递增子序列 V2 (LIS)

    传送门 Description 数组A包含N个整数.设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS).A的LIS可 ...

  2. 动态规划——最长上升子序列问题(LIS)

    动态规划--最长上升子序列问题(LIS) 最长上升子序列问题(LIS).给定n个整数A1,A2,-,AnA_1, A_2, \dots , A_n,按从左到右的顺序选出尽量多的整数,组成一个上升子序列 ...

  3. 最长上升子序列(LIS)问题的解决及优化

    1.LIS:最长上升子序列问题 LIS问题的描述为:给定一个整数序列array,找到它的所有严格递增子序列中最长的序列,输出其长度. 例:10 9 2 5 3 7 101 18 它的最长上升子序列有: ...

  4. 最长递增子序列(LIS)

    最长递增子序列(LIS) 问题描述: 求一个序列的最长递增子序列,这样的子序列是允许中间越过一些字符的,即留"空". 例如:4 2 3 1 5 的最长递增子序列为 2 3 5,长度 ...

  5. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)

    目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...

  6. LCS最长公共子序列和LIS最长上升子序列——例题剖析

    一.LCS最长公共子序列 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我) longest comment subsequence 模板题 longe ...

  7. 最长上升子序列(LIS)算法

    LIS定义 LIS(Longest Increasing Subsequence)最长上升子序列  一个数的序列bi,当b1 < b2 < - < bS的时候,我们称这个序列是上升的 ...

  8. 动态规划-最长上升子序列(LIS)

    这题目是经典的DP题目,也可叫作LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列.很基础的题目,有两种算法,复杂度分别为O(n*logn)和 ...

  9. 51Nod-1134 最长递增子序列【LIS】

    1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如 ...

最新文章

  1. 使用phpMyAdmin时出现PHP 5.3+is required的解决方案
  2. C博客作业03--函数
  3. 一些编译php时的configure 参数
  4. mysql食堂系统E R图_食堂管理系统E-R图.doc
  5. linux dstat,dstat 用法详解
  6. 云呐智能运维工具,智能运维工具怎么用
  7. Cisco 防火墙 ASA DHCP 配置
  8. 腾讯云人脸支付常见问题和解答,以及腾讯云人脸支付相关介绍
  9. 易支付v5.8个人二维码免签系统破解版
  10. 利用python构建信用卡评分
  11. java smali_Android逆向——smali复杂类解析
  12. std::binary_serach, std::upper_bound以及std::lower_bound
  13. json字段名不一致的问题
  14. lol封号维护服务器,LOL玩家被封三年执着理论,腾讯客服是这样回复的
  15. 海尔全球十一连冠背后: 生态时代的无限游戏
  16. ubuntu 如何放大终端窗口字体
  17. 如何有效管理游戏开发过程
  18. 2023年湖北武汉建设厅特种工架子工证怎么报名?报考条件?启程别
  19. 源发行版 8 需要目标发行版 1.8
  20. 基于Arduino控制步进电机 编码器普菲特TB6600控制

热门文章

  1. 关于Hexo6.0搭建个人博客(github+Google-收录篇)
  2. 设计模式(二) 工厂模式
  3. 工作区 暂存区 版本库之间的关系
  4. Sass--@-Rules
  5. centos6下时间同步(ntp)操作
  6. 利用SecureCRT上传、下载文件(使用sz与rz命令)
  7. 用户二次登陆,干掉第一次登录的session
  8. eclipse更改Server Location的问题
  9. 「学习笔记——Python」Python 的模块(Modules)
  10. if you want to buy something