线性动态规划

article/2025/6/8 3:09:57

具有「线性」阶段划分的动态规划方法统称为线性动态规划(简称为「线性 DP」),如下图所示。

一、概念

如果状态包含多个维度,但是每个维度上都是线性划分的阶段,也属于线性 DP。比如背包问题、区间 DP、数位 DP 等都属于线性 DP。

线性 DP 问题的划分方法有多种方式。

  • 如果按照「状态的维度数」进行分类,我们可以将线性 DP 问题分为:一维线性 DP 问题、二维线性 DP 问题,以及多维线性 DP 问题。
  • 如果按照「问题的输入格式」进行分类,我们可以将线性 DP 问题分为:单串线性 DP 问题、双串线性 DP 问题、矩阵线性 DP 问题,以及无串线性 DP 问题。

二、单串线性 DP 问题

1. 问题

单串线性 DP 问题:问题的输入为单个数组或单个字符串的线性 DP 问题。状态一般可定义为 dp[i],表示为:

  1. 「以数组中第 i个位置元素 nums[i]] 为结尾的子数组(nums[0]...nums[i])」的相关解。
  2. 「以数组中第 i−1个位置元素 nums[i−1]为结尾的子数组(nums[0]...nums[i−1])」的相关解。
  3. 「以数组中前 i个元素为子数组(nums[0]...nums[i−1])」的相关解

这 3 种状态的定义区别在于相差一个元素 nums[i]。

  1. 第 1种状态:子数组的长度为 i+1,子数组长度不可为空;
  2. 第 2 种状态、第 3 种状态:这两种状态描述是相同的。子数组的长度为 i,子数组长度可为空。在 i=0时,方便用于表示空数组(以数组中前 0 个元素为子数组)

三、最长递增子序列

单串线性 DP 问题中最经典的问题就是「最长递增子序列(Longest Increasing Subsequence,简称 LIS)」。

1. 实战练习

给定一个整数数组 nums,找到其中最长严格递增子序列的长度

  • 子序列:由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
  • 1≤nums.length≤2500。
  • −10^4≤nums[i]≤10^4。

2. 代码

class Solution {// 定义长度最长递增子序列的方法lengthOfLIS(nums) {// 获取数组的长度const size = nums.length;// 创建并初始化动态规划数组,初始值为1const dp = new Array(size).fill(1);// 外层循环迭代每个元素for (let i = 0; i < size; i++) {// 内层循环迭代当前元素之前的元素for (let j = 0; j < i; j++) {// 如果当前元素大于之前的元素,可以将当前元素加入递增子序列if (nums[i] > nums[j]) {// 更新以当前元素结尾的递增子序列的长度dp[i] = Math.max(dp[i], dp[j] + 1);}}}// 返回动态规划数组中的最大值,即为最长递增子序列的长度return Math.max(...dp);}
}// 示例用法
const solution = new Solution();
// 输出最长递增子序列的长度
console.log(solution.lengthOfLIS([10, 9, 2, 5, 3, 7, 101, 18]));

四、最大子数组和

单串线性 DP 问题中除了子序列相关的线性 DP 问题,还有子数组相关的线性 DP 问题。

注意

  • 子序列:由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。
  • 子数组:指的是数组中的一个连续子序列。

「子序列」与「子数组」都可以看做是原数组的一部分,而且都不会改变原来数组中元素的相对顺序。其区别在于数组元素是否要求连续。

1. 实战练习

给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和

2. 代码

class Solution {maxSubArray(nums) {// 获取数组的长度const size = nums.length;// 创建并初始化动态规划数组,初始值为0const dp = new Array(size).fill(0);// 初始化动态规划数组的第一个元素dp[0] = nums[0];// 从数组的第二个元素开始遍历for (let i = 1; i < size; i++) {// 如果前一个元素的动态规划值小于0,说明不利于累积当前元素,直接以当前元素为起点重新计算if (dp[i - 1] < 0) {dp[i] = nums[i];} else {// 否则,累积当前元素,更新动态规划值dp[i] = dp[i - 1] + nums[i];}}// 返回动态规划数组中的最大值,即为最大子数组和return Math.max(...dp);}
}// 示例用法
const solution = new Solution();
// 输出最大子数组和
console.log(solution.maxSubArray([-2, 1, -3, 4, -1, 2, 1, -5, 4]));

五、最长的斐波那契子序列的长度

有一些单串线性 DP 问题在定义状态时需要考虑两个结束位置,只考虑一个结束位置的无法清楚描述问题。这时候我们就需要需要增加一个结束位置维度来定义状态

1. 实战练习

给定一个严格递增的正整数数组 arr,从数组 arr 中找出最长的斐波那契式的子序列的长度。如果不存斐波那契式的子序列,则返回 0。

2. 代码

class Solution {lenLongestFibSubseq(arr) {const size = arr.length;let ans = 0;// 枚举所有可能的前两个数for (let i = 0; i < size; i++) {for (let j = i + 1; j < size; j++) {let tempAns = 0;let tempI = i;let tempJ = j;let k = j + 1;// 在数组中搜索斐波那契子序列while (k < size) {// 如果当前三个数满足斐波那契关系if (arr[tempI] + arr[tempJ] === arr[k]) {tempAns += 1;tempI = tempJ;tempJ = k;}k += 1;}// 更新最大斐波那契子序列长度if (tempAns > ans) {ans = tempAns;}}}// 如果找到了斐波那契子序列,返回长度加上初始的两个数if (ans > 0) {return ans + 2;} else {return ans;}}
}// 示例用法
const solution = new Solution();
// 输出最长斐波那契子序列的长度
console.log(solution.lenLongestFibSubseq([1, 2, 3, 4, 5, 6, 7, 8])); 


http://www.hkcw.cn/article/CUKBmmZYoC.shtml

相关文章

如何做接口测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 01、通用的项目架构 02、什么是接口 接口&#xff1a;服务端程序对外提供的一种统一的访问方式&#xff0c;通常采用HTTP协议&#xff0c;通过不同的url&#xff…

父文档检索器引和RAG的context precision性能指标

父文档检索器引和context precision性能指标 父文档检索器是一种搜索工具,用来从一大堆文档中找出跟你的问题最相关的答案。它的特别之处在于,它会先把文档分成小块(子片段),然后找到最相关的小块,再返回这些小块所属的完整大文档(父文档)。这样既能精准找到相关内容,…

平台化 LIMS 系统架构 跨行业协同与资源共享的实现路径

在科技快速发展的今天&#xff0c;质检行业正面临着效率、合规和数据安全的多重挑战。新一代质检 LIMS 系统以智能化与平台化为核心&#xff0c;为实验室管理提供了全新的解决方案。 一、智能化&#xff1a;从数据采集到分析的全流程升级 传统质检流程中&#xff0c;人工数据录…

[蓝桥杯]路径之谜

路径之谜 题目描述 小明冒充 XX 星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 nnnn 个方格。如下图所示。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或纵向移动&#xff0c;但不能斜…

奥威BI+AI数据分析:企业数智化转型的加速器

在当今数据驱动的时代&#xff0c;企业对于数据分析的需求日益增长。奥威BIAI数据分析的组合&#xff0c;正成为众多企业数智化转型的加速器。 奥威BI以其强大的数据处理和可视化能力著称。它能够轻松接入多种数据源&#xff0c;实现数据的快速整合与清洗。通过内置的ETL工具&…

大模型的外围关键技术

最简易前端&#xff1a;Gradio 基本介绍 Gradio 是一个用于快速创建可分享的机器学习模型界面的开源 Python 库。通过 Gradio&#xff0c;开发者能够轻松地为他们的模型创建前端界面&#xff0c;从而使非技术用户也可以通过简单的网页界面与这些模型进行交互。 Gradio 的一些…

electron定时任务,打印内存占用情况

// 监听更新 function winUpdate(){// 每次执行完后重新设置定时器try {// 获取当前时间并格式化为易读的字符串const now new Date();const timeString now.toLocaleString();console.log(当前时间: ${timeString});// 记录内存使用情况&#xff08;可选&#xff09;const m…

建筑工程施工进度智能编排系统 (SCS-BIM)

建筑工程施工进度智能编排 (SCS-BIM) 源码可见于&#xff1a;https://github.com/Asionm/SCS-BIM 项目简介 本项目是一个面向建筑工程的施工进度智能编制平台&#xff0c;用户只需上传一份标准 IFC 建筑信息模型文件&#xff0c;系统将自动完成以下任务&#xff1a; 解析模…

小红薯商品搜索详情分析与实现

前言 小红书作为国内知名的社交电商平台&#xff0c;拥有丰富的商品数据和用户评价信息。对于数据分析师、产品经理或电商从业者来说&#xff0c;能够获取小红书的商品数据具有重要的商业价值。本文将详细介绍如何通过逆向工程实现小红书商品搜索API的调用。 免责声明&#xf…

国标GB28181设备管理软件EasyGBS视频平台筑牢文物保护安全防线创新方案

一、方案背景​ 文物作为人类文明的珍贵载体&#xff0c;具有不可再生性。当前&#xff0c;盗窃破坏、游客不文明行为及自然侵蚀威胁文物安全&#xff0c;传统保护手段存在响应滞后、覆盖不全等局限。随着5G与信息技术发展&#xff0c;基于GB28181协议的EasyGBS视频云平台&…

使用 Python + ExecJS 获取网易云音乐歌曲歌词

&#x1f3b5; 使用 Python ExecJS 获取网易云音乐歌曲歌词 在本篇博客中&#xff0c;我们将通过一个完整的 Python 脚本&#xff0c;利用 execjs 模块调用 JavaScript 代码&#xff0c;成功获取网易云音乐的歌曲歌词。整个过程涵盖了加密参数的生成、API 请求发送与歌词提取…

云台式激光甲烷探测器:守护工业安全的“智慧之眼”

在石油化工、天然气场站、城市燃气管网等场景中&#xff0c;甲烷泄漏的早期监测是保障生产安全的核心防线。云台式激光甲烷探测器凭借高精度、无接触、智能化的技术优势&#xff0c;成为工业安全监测领域的革新者。本文将深度解析其技术原理、核心功能及适用场景&#xff0c;助…

基于YOLO-NAS-Pose的无人机象群姿态估计:群体行为分析的突破

【导读】 应对气候变化对非洲象的生存威胁&#xff0c;本研究创新采用无人机航拍结合AI姿态分析技术&#xff0c;突破传统观测局限。团队在肯尼亚桑布鲁保护区对比测试DeepLabCut与YOLO-NAS-Pose两种模型&#xff0c;首次将后者引入野生动物研究。通过检测象群头部、脊柱等关键…

CppCon 2014 学习:Anatomy of a Smart Pointer

智能指针&#xff08;smart pointer&#xff09;可以这样解释&#xff1a; 它是一个指针的容器——内部保存了一个普通指针&#xff0c;并且可以在需要时把指针交给你使用。它支持RAII&#xff08;资源获取即初始化&#xff09;&#xff0c;也就是说资源&#xff08;比如内存&…

GNhao,国外云手机号智能选择与应用解析!

GNhao&#xff0c;国外云手机号智能选择与应用解析&#xff01; 在数字时代&#xff0c;国外云手机号成为跨境沟通的关键。GNhao凭借其稳定的国外云手机号服务&#xff0c;满足了用户多样需求&#xff0c;提升了通讯效率。国外云手机号广泛应用于海外注册、跨境营销和社交&…

AcWing 843:n-皇后问题 ← dfs

【题目来源】 https://www.acwing.com/problem/content/845/ https://www.lanqiao.cn/problems/1508/learning/ https://www.luogu.com.cn/problem/P1219 【题目描述】 n 皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任…

风机巡检方案艰难之路

2025年是“双碳”目标提出后首个五年计划收关节点&#xff0c;政策端通过强化大基地建设与海风开发确保既定风电目标落地。根据《2025年能源工作指导意见》&#xff0c;2025年将通过加速第二批/第三批大基地及海上风电建设保障目标兑现。据联储证券预计&#xff0c;2025年全年陆…

Java-redis实现限时在线秒杀功能

1.使用redisson pom文件添加redisson <!--redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.4</version></dependency> 2.mysql数据库表设…

龙虎榜——20250603

上证指数放量收阳线&#xff0c;阳包阴&#xff0c;量能超过5天均量&#xff0c;个股涨多跌少&#xff0c;行情有所回暖。 深证指数缩量收阳线&#xff0c;再次回打支撑位。 2025年6月3日龙虎榜行业方向分析 1. 医药&#xff08;创新药原料药出口&#xff09; 代表标的&…

永磁同步电机无速度算法--互补滑模观测器

一、原理介绍 采用了互补滑模变结构观测器&#xff0c;滑模面选择了广义滑模面和互补滑模面相结合的设计&#xff0c;这样可以有效地降低系统的跟踪误差&#xff0c;提高系统的跟踪性能&#xff0c;切换控制率选择饱和函数&#xff0c;抑制了传统SMC 的抖振现象。 二、仿真模型…