当前位置: 首页 > news >正文

动态规划之子序列问题1

以leetcode300题为例

此题最为经典,所有的算法书在讲子序列问题时都以这个为模板题,后面的题可以按照此题的分析方法进行分析

 区分子序列和子数组

例如a,b,c,d,e这个数组

子数组是必须连续的,就比如必须是abc,cde等

子序列不要求连续,只要相对顺序是对的就行,比如ace,abc都是一个子序列

这样来看子序列包括子数组

为什么子序列的问题复杂,因为包含的情况多,

所有的子序列是2^n次方,子数组是是一个等差数列(n+1)*n/2

题目分析

要求严格递增的子序列的最长长度,可以通过实例分析,什么叫严格,就是子序列相邻的两个元素不能相等,像77777,最长的就只能为7,也就是一个长度

算法原理

1.状态表示:经验+题目要求

 经验有两个,像这种线性的可以大概套一下,以i位置为结尾巴拉巴拉(如果后面分析不对,可以换成以i位置为起始,巴拉巴拉)

题目要求:以i位置为结尾的所有子序列中,最长的递增子序列的长度

dp[i]:以i位置元素为结尾的所有的子序列中,最长的递增子序列的长度

2.状态转移方程:以最近的一步划分子问题

分析状态转移方程时,要时刻知道清楚自己的dp[i] 表示什么

你要求的是dp[i]=什么?,也就是找所有包含i位置元素的所有子序列,然后比较得到最长的

可以分两种:1:自己构成一个子序列,也就是1

2:跟在别人后面构成子序列,你可以跟在i-1/i-2/i-3等后面,也就是比较所有跟在这些后面的长度

能跟在的前提是nums[i]>nums[i-1],因为你求的是最长的递增子序列

 

为什么要初始化为1?因为你最差的情况就是一个元素构成一个子序列,那这样我们填表的时候就不需要分两种情况,只要算其中一种就行,不满足它自动就是1

编写代码 

http://www.xdnf.cn/news/295309.html

相关文章:

  • n8n中Wait节点的使用详解:流程暂停与恢复的实战指南
  • CodeQL-CLI工具小白入门
  • hp主机安装ubuntu 22.04版本并换阿里源
  • 【Unity】一个AssetBundle热更新的使用小例子
  • n8n 中 Compare Datasets 节点使用详解
  • 怎么使用nacos作注册中心 + 配置中心。
  • PCA降维详解
  • 信息安全导论 第八章 入侵检测技术
  • 手表关于MPU6050中的功能实现
  • 深入理解C语言中的内存区域:堆、栈与变量存储空间详解
  • Python 文件操作详解:从基础到实践
  • 面向对象与过程介绍
  • Java学习手册:Hibernate/JPA 使用指南
  • Oracle OCP认证考试考点详解083系列08
  • 高速接口:PCIe 3.0 Link Training的详细过程
  • 5.4 - 5.5Web基础+c语言拓展功能函数
  • MyDB - 手写数据库
  • Spring 框架的底层原理
  • 【Fifty Project - D22】
  • 三维重建(二十一)——第二步和第三步
  • 相机biaoding
  • 进程与线程:06 操作系统之“树”
  • GESP2024年3月认证C++八级( 第二部分判断题(1-5))
  • URL混淆与权限绕过技术
  • pta的cpp选择判断题
  • 【C语言编译】编译原理和详细过程
  • 数据库的原子事务
  • Cursor报错Your request has been blocked解决方案
  • JavaSE核心知识点01基础语法01-02(基本数据类型、运算符、运算符优先级)
  • 【信息系统项目管理师-论文真题】2006下半年论文详解(包括解题思路和写作要点)