从一道板子题了解LIS(最长上升子序列)

在理解LIS之前,需要理解什么是子序列,子序列指的是一个序列中,按照原顺序选出若干个不一定连续的元素所组成的序列,在求解LIS时,一般我们会设dp[i]表示1~i序列中以a[i]结尾的最长上升子序列的长度,状态转移方程为:

dp[i] = max(dp[j] + 1),if a[i] > a[j]//表示a[i]要插入到不同子序列后面的情况

LIS的简单模板为:

for(int i=1;i<=n;i++)
  {
    dp[i] = 1;
    for(int j=1;j<=i;j++)
    {
      if(a[i] > a[j])dp[i] = max(dp[i],dp[j] + 1);
    }
  }

每次都是更新dp[i]的值,即为以i对应的数字结尾的最大上升子序列的长度,那么按照本题题意,是不是输出dp][n]即可?未必,因为所求长度为n的最长子序列不一定以n对应数字结尾,比如原数组为1,5,4,3,6,7,1,此时是以n - 1结尾,所以还是得求dp[i]的最大值,即为ans = max(ans, dp[i]),初始化ans,并且最后输出ans即可。

最后说明一下,本次写的LIS模板是朴素的形式,复杂度为O(n^2),在较小的输入量可以通过,而较大的输入量就要考虑使用二分查找对应的复杂度为O(logn)的形式来求解。我们有机会再讲,先消化下这个朴素形式。

本次LIS板子题原题链接:

https://www.lanqiao.cn/problems/2049/learning/?page=1&first_category_id=1&name=%E8%93%9D%E6%A1%A5%E5%8B%87%E5%A3%AB

相关推荐

  1. 一道板子了解LIS(上升序列)

    2024-02-13 17:56:01       67 阅读
  2. 上升序列模板(LIS

    2024-02-13 17:56:01       27 阅读
  3. 上升序列(递增序列,LIS)

    2024-02-13 17:56:01       25 阅读
  4. 备战蓝桥杯 Day8(上升序列LIS模型)

    2024-02-13 17:56:01       30 阅读
  5. 备战蓝桥杯---上升序列LIS)模板

    2024-02-13 17:56:01       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-13 17:56:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-13 17:56:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-13 17:56:01       82 阅读
  4. Python语言-面向对象

    2024-02-13 17:56:01       91 阅读

热门阅读

  1. rtt设备io框架面向对象学习-adc设备

    2024-02-13 17:56:01       55 阅读
  2. 鸿蒙harmony--TypeScript类详解

    2024-02-13 17:56:01       46 阅读
  3. Redis的持久化方式

    2024-02-13 17:56:01       49 阅读
  4. 接口测试:项目测试

    2024-02-13 17:56:01       47 阅读
  5. 异步复位同步释放原则

    2024-02-13 17:56:01       45 阅读
  6. Day31 贪心算法part01

    2024-02-13 17:56:01       58 阅读
  7. 1277. 统计全为 1 的正方形子矩阵

    2024-02-13 17:56:01       59 阅读
  8. Ubuntu Desktop 开机数字小键盘

    2024-02-13 17:56:01       60 阅读
  9. 【力扣每日一题】力扣144二叉树的前序遍历

    2024-02-13 17:56:01       59 阅读