动态规划中的 求“最长”、“最大收益”、“最多区间”、“最优策略” 双重 for + 状态转移

以最长递增子序列为例

🎯 首先明确目标

最长上升子序列(LIS)为例,假设输入是:

nums := []int{10, 9, 2, 5, 3, 7, 101, 18}

我们定义:

dp[i]:以 nums[i] 为结尾的最长上升子序列长度

目标:求 dp[i] 的最大值。


🔍 双重 for 的意义是什么?

for i := 1; i < n; i++ {for j := 0; j < i; j++ {if nums[j] < nums[i] {dp[i] = max(dp[i], dp[j] + 1)}}
}

这里我们来解释:

✅ 第一层循环:从左到右遍历每一个位置 i

我们要计算:以 nums[i] 结尾的“最长上升子序列”是多少?

✅ 第二层循环:查看所有在 i 之前的数 j

对于每一个前面的数 nums[j],判断:

它是否可以作为 nums[i] 的前一个元素?
也就是判断 nums[j] < nums[i]

如果是,就说明:

如果我以 j 为结尾的子序列有长度 dp[j]
那么我在它后面加上 nums[i],就可以构成一个更长的上升序列,长度是 dp[j] + 1

于是我们尝试更新 dp[i]

dp[i] = max(dp[i], dp[j] + 1)

🔁 用人话解释一遍:

“我想知道 nums[i] 能不能接在某个前面的上升序列后面,
如果能,那我就更新一下它作为结尾时,能组成多长的子序列。”


🧠 一个具体例子(带注释)

nums := []int{10, 9, 2, 5, 3, 7}初始化 dp := []int{1, 1, 1, 1, 1, 1}  // 每个位置起码是自己i = 3, nums[3] = 5j = 0, nums[0] = 10 -> 跳过j = 1, nums[1] = 9 -> 跳过j = 2, nums[2] = 2 -> 2 < 5 -> 更新 dp[3] = max(1, dp[2] + 1) = 2i = 4, nums[4] = 3j = 0 -> 10 > 3 -> 跳过j = 1 -> 9 > 3 -> 跳过j = 2 -> 2 < 3 -> dp[4] = max(1, dp[2]+1) = 2j = 3 -> 5 > 3 -> 跳过i = 5, nums[5] = 7j = 0 -> 10 > 7 -> 跳过j = 1 -> 9 > 7 -> 跳过j = 2 -> 2 < 7 -> dp[5] = max(1, 1+1) = 2j = 3 -> 5 < 7 -> dp[5] = max(2, 2+1) = 3j = 4 -> 3 < 7 -> dp[5] = max(3, 2+1) = 3

🧩 为什么不能只用一个循环?

因为我们求的是:

“在前面所有满足条件的数里,找一个最优的情况来更新当前的状态”。

只有看完所有的 j < i 才能找到最优的更新路径,所以必须有一个内层循环来“扫描过去”。


✅ 总结记忆方法:

  • i当前状态

  • j过去状态

  • if 条件成立,说明可以从过去 j 走到现在 i

  • dp[i] = max(dp[i], dp[j]+1) 就是取过去所有能转移过来的路径中最优的那一条

for i := 1; i < n; i++ {for j := 0; j < i; j++ {// 某种条件成立// dp[i] = max(dp[i], dp[j] + ...)}
}

这类“双重 for + 状态转移”的写法,在一类特定的动态规划问题中非常经典和高频。这类问题一般具有以下特征:


✅ 典型问题特征

  1. 子问题具有前后关系(i/j 结构)

    • 当前状态 i 要依赖过去某些状态 j < i

    • 类似“前缀分析”

  2. 具有单调性约束

    • nums[j] < nums[i]end[j] <= start[i] 等条件

  3. 求解最大/最小值

    • 求“最长”、“最大收益”、“最多区间”、“最优策略”


✅ 高频问题示例

问题类型描述dp含义转移条件
最长上升子序列 (LIS)找递增的最大长度dp[i]:以 i 结尾的最长长度nums[j] < nums[i]
最长不下降子序列可以等于也递增dp[i]nums[j] <= nums[i]
最长摆动子序列上下起伏交替up[i], down[i]比较大小后转移
最大不重叠区间数按 end 排序后贪心/DPdp[i]:前 i 个的最大区间数end[j] <= start[i]
最大信封嵌套数(俄罗斯套娃)求最多可嵌套信封数对宽升高做 LISw[j] < w[i] && h[j] < h[i]
打家劫舍变形不偷相邻的dp[i]:前 i 个最大金额dp[i] = max(dp[i-1], dp[i-2]+nums[i])
最大连续子数组积需要 max 和 minmax[i], min[i] 同时维护根据乘积正负转移

✅ 模板结构(可抽象成函数)

for i := 1; i < n; i++ {for j := 0; j < i; j++ {if 满足条件(j, i) {dp[i] = max(dp[i], dp[j] + 某个值)}}
}

✅ 小技巧:可以加上前向指针以恢复路径

prev := make([]int, n) // 记录转移路径
for i := range prev {prev[i] = -1
}
...
if dp[j] + 1 > dp[i] {dp[i] = dp[j] + 1prev[i] = j
}

如果你以后看到类似“最XXX的子序列”“最XXX的不重叠区间”,只要是“i依赖j”型的问题,几乎都可以优先尝试这个模板。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SEO关键词与长尾词高效布局

内容概要 在SEO优化实践中&#xff0c;关键词布局的科学性与系统性直接影响流量的获取效率与可持续性。本文以核心关键词筛选为起点&#xff0c;结合长尾词挖掘工具与语义关联分析技术&#xff0c;逐步构建覆盖用户全搜索场景的内容矩阵。通过金字塔结构模型&#xff0c;实现高…

考研数一公式笔记

考研数学&#xff08;一&#xff09;核心结论与易错点详细笔记 第一部分&#xff1a;高等数学 一、函数、极限、连续 (一) 重要结论与公式 等价无穷小替换 (仅限乘除运算&#xff0c;极限过程为 x → 0 或某特定值导致因子→0)&#xff1a; sin x ~ x tan x ~ x arcsin x …

Debezium TableSchemaBuilder详解

Debezium TableSchemaBuilder详解 1. 类的作用与功能 1.1 核心作用 TableSchemaBuilder是Debezium中负责构建表Schema的核心类,主要功能包括: Schema构建:将数据库表结构转换为Kafka Connect的Schema定义主键处理:生成表的主键Schema值Schema处理:生成表的非主键字段Sc…

49 python Matplotlib之Pandas 数据可视化

Pandas 是 Python 中用于数据处理的核心库,其内置了基于 Matplotlib 的可视化功能,可通过 DataFrame.plot() 和 Series.plot() 方法快速生成常见图表,无需手动编写绘图代码,大幅提升效率。 一、Pandas 核心绘图方法 基础语法如下:该代码为伪代码,仅做语法说明,无法执行…

《微服务架构设计模式》笔记

思维导图 1-3章 4-6 章 5-13 章 资料 配套代码仓库&#xff1a;https://github.com/microservices-patterns/ftgo-application 作者网站&#xff1a;https://microservices.io/

手写一个简单的线程池

手写一个简单的线程池 项目仓库&#xff1a;https://gitee.com/bossDuy/hand-tearing-thread-pool 基于一个b站up的课程&#xff1a;https://www.bilibili.com/video/BV1cJf2YXEw3/?spm_id_from333.788.videopod.sections&vd_source4cda4baec795c32b16ddd661bb9ce865 理…

手机打电话时由对方DTMF响应切换多级IVR语音菜单(完结)

手机打电话时由对方DTMF响应切换多级IVR语音菜单&#xff08;完结&#xff09; --本地AI电话机器人 上一篇&#xff1a;手机打电话时由对方DTMF响应切换多级IVR语音菜单&#xff08;话术脚本与实战&#xff09; 下一篇&#xff1a;编写中 一、前言 经过前面几个篇章的详细阐…

Android.mk解析

一、变量说明: 1.LOCAL_PATH:= $(call my-dir) 此行代码在Android.mk的开头,用于给出当前文件的路径 LOCAL_PATH 用于在开发树中查找源文件 宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录) 2.LOCAL_PACKAGE_NAME := SecSettings …

ip地址改了网络还能用吗?ip地址改了有什么后果

当用户发现自己的网络出现异常时&#xff0c;常常会疑惑&#xff1a;如果IP地址被更改&#xff0c;网络是否还能正常使用&#xff1f;要解答这个问题&#xff0c;需要从IP地址的作用、修改方式以及网络配置等多个角度来分析。 一、IP地址的作用 IP地址是设备在网络中的唯一标识…

Python-Django系列—日志

Python 程序员通常会在其代码中使用 print() 作为一种快速和方便的调试工具。使用日志框架只比这多花一点点工夫&#xff0c;但更加优雅和灵活。除了用于调试之外&#xff0c;日志还可以为您提供有关应用程序状态和健康状况的更多信息&#xff0c;而且这些信息结构更清晰。 一…

ArcGIS Pro对图斑进行等比例、等面积、等宽度的分割

ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放_arcgis视频教程我要自学网-CSDN博客 4大遥感软件&#xff01;遥感影像解译&#xff01;ArcGISENVIErdaseCognition_遥感解译软件-CSDN博客 今天介绍一下ArcGIS Pro对图斑进行等比例、等面积、等宽度的分割&#xff0…

”故茗”茶文化网站

摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#xff0c;让整个世界都可以即时通话…

【和春笋一起学C++】(十五)字符串作为函数参数

1. char指针作为函数参数 在C语言中&#xff0c;表示字符串的方式有3种&#xff1a; char数组用引号括起的字符串常量char指针 这3种形式都可以将其作为实参传递给函数中的参数&#xff08;char*&#xff09;&#xff0c;因此函数的形参需要使用char*类型。将字符串作为参数…

VueRouter路由组件的用法介绍

1.1、<router-link>标签 <router-link>标签的作用是实现路由之间的跳转功能&#xff0c;默认情况下&#xff0c;<router-link>标签是采用超链接<a>标签显示的&#xff0c;通过to属性指定需要跳转的路由地址。当然&#xff0c;如果你不想使用默认的<…

【C/C++】胜者树与败者树:多路归并排序的利器

文章目录 胜者树与败者树&#xff1a;多路归并排序的利器1 胜者树简介1.1 定义1.2 胜者树结构与原理1.2.1 构造流程1.2.2 归并过程 2 败者树简介2.1 背景场景2.2 基本定义2.3 败者树结构和原理2.3.1 树的构造&#xff08;初始建树&#xff09;2.3.2 查询和更新 3 胜者树 vs 败者…

零基础设计模式——第二部分:创建型模式 - 原型模式

第二部分&#xff1a;创建型模式 - 5. 原型模式 (Prototype Pattern) 我们已经探讨了单例、工厂方法、抽象工厂和生成器模式。现在&#xff0c;我们来看创建型模式的最后一个主要成员——原型模式。这种模式关注的是通过复制现有对象来创建新对象&#xff0c;而不是通过传统的…

C++(初阶)(十九)——红黑树

红黑树 红黑树概念规则实现结点插入变色变色参考代码&#xff1a; 查找查找参考代码 遍历 红黑树检查完整代码 概念 红⿊树是⼀棵⼆叉搜索树。它的每个结点增加⼀个存储位来表示结点的颜⾊&#xff0c;可以是红色或者黑色&#xff08;并不会出现第三种颜色&#xff09;。 通过…

Mistral AI 开源最新 Small 模型——Devstral-Small-2505

Devstral 是一款专为软件工程任务设计的代理型大语言模型&#xff08;LLM&#xff09;&#xff0c;由 Mistral AI 和 All Hands AI 合作开发 &#x1f64c;。Devstral 擅长使用工具探索代码库、编辑多个文件以及驱动软件工程代理。该模型在 SWE-bench 上表现出色&#xff0c;使…

CDGA|一线二线企业数据治理项目目前发展状况

一线城市与二线城市企业在数据治理项目的发展状况上存在一定差异&#xff0c;主要体现在目标、资源投入、策略实施以及文化培育等方面。 一线城市企业数据治理项目发展状况 ‌数据治理目标全面系统‌&#xff1a; ‌数据质量与安全‌&#xff1a;一线城市的大型企业通常拥有海量…

Lyra学习笔记1地图角色加载流程

目录 1 地图加载流程1.1 默认Experience的加载1.2 加载角色1.3 加载场景中的几个传送点 2 几个内建类的笔记2.1 UDataAsset2.2 UAssetManager 纯个人笔记&#xff0c;有错误欢迎指正&#xff0c;学习阶段基本看到不会的就写一写&#xff0c;最后有时间会梳理整体结构 先看完了官…