news 2026/5/28 8:40:29

动态规划dp

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态规划dp

动态规划核心原理:

动态规划dp是一种用空间换时间、用子问题解父问题的思想。

例题1:爬楼梯(一维线性DP,入门必练)

题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶?

第一步:定义dp数组/状态

dp[i]:爬到第i阶楼梯的不同方法数。(这里i从1开始,和题目中的“n阶”对应,更直观)

第二步:推导状态转移方程

要爬到第i阶,有两种途径:

每次都要达到第i阶,每次选择都是1或2步,最后一次的选择分为两种情况,每次情况下都是之前循环算好的方案数

  • 从第i-1阶,爬1个台阶上来,方法数等于dp[i-1];

  • 从第i-2阶,爬2个台阶上来,方法数等于dp[i-2];

因此,总方法数是两种途径的和,状态转移方程:dp[i] = dp[i-1] + dp[i-2]

第三步:初始化边界条件
  • 当i=1时,只有1种方法(爬1个台阶),所以dp[1] = 1;

  • 当i=2时,有2种方法(1+1、2),所以dp[2] = 2;

(注:如果i从0开始,dp[0]=1(表示爬到0阶,有一种方法:不爬),dp[1]=1,结果一致,可根据个人习惯选择)

第四步:部分代码

例题2:01背包(经典面试题,二维DP入门)

题目:有n件物品和一个容量为v的背包。每件物品只能使用一次,第i件物品的重量是weight[i],价值是value[i]。求将哪些物品装入背包,可使这些物品的总重量不超过背包容量,且总价值最大。

示例:n=3,v=4,weight=[1,3,4],value=[15,20,30],求最大价值。

第一步:定义dp数组/状态

dp[i][j]:前i件物品(从第1件到第i件),放入容量为j的背包中,能获得的最大价值。(i从1开始,对应物品编号;j从0开始,对应背包容量)

第二步:推导状态转移方程

对于第i件物品,有两种选择:装或不装,取两种选择的最大值。

  • 不装第i件物品:最大价值 = 前i-1件物品放入容量j的背包的最大价值,即dp[i-1][j];

  • 装第i件物品:前提是背包容量j ≥ 物品i的重量weight[i-1](因为Python列表从0索引),此时最大价值 = 前i-1件物品放入容量j-weight[i-1]的背包的最大价值 + 物品i的价值value[i-1],即dp[i-1][j - weight[i-1]] + value[i-1];

因此,状态转移方程:

当j < weight[i-1]:$$dp[i][j] = dp[i-1][j]$$(装不下,只能不装)

当j ≥ weight[i-1]:$$dp[i][j] = max(dp[i-1][j], dp[i-1][j - weight[i-1]] + value[i-1])$$

第三步:初始化边界条件
  • 当i=0(前0件物品,即没有物品):无论背包容量j是多少,最大价值都是0,所以dp[0][j] = 0(j从0到v);

  • 当j=0(背包容量为0):无论有多少件物品,都装不下,最大价值都是0,所以dp[i][0] = 0(i从0到n);

第四步:确定遍历顺序

有两个遍历维度:物品i(从1到n)和背包容量j(从1到v)。

遍历顺序:先遍历物品,再遍历背包容量(也可以先遍历背包再遍历物品,不影响结果,但先遍历物品更直观)。

注意:背包容量j要从1到v遍历(正序),因为01背包中每件物品只能用一次,正序遍历不会重复使用物品

第五步:部分代码

刷题路线(从易到难):

  1. 入门:爬楼梯、斐波那契数列(一维线性DP);

  2. 基础:打家劫舍、最小路径和(二维线性DP);

  3. 进阶:01背包、完全背包、多重背包(背包DP);

  4. 提升:最长递增子序列、最长公共子序列(区间DP);

  5. 面试高频:二叉树的最大路径和(树形DP)、编辑距离(区间DP)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 8:40:29

网络安全之入侵检测系统

网络安全之入侵检测系统 一 入侵检测定义 入侵&#xff1a;指一系列试图破坏信息资源机密性、完整性和可用性的行为。对信息系统的非授权访问及&#xff08;或&#xff09;未经许可在信息系统中进行操作。入侵检测&#xff1a;是通过从计算机网络系统中的若干关键节点收集信息…

作者头像 李华
网站建设 2026/5/23 1:55:42

单元测试、系统测试、集成测试三者的区别

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 实际的测试工作当中&#xff0c;我们会从不同的角度对软件测试的活动进行分类&#xff0c;“单元测试&#xff0c;集成测试&#xff0c;系统测试”&#xff0c;是按…

作者头像 李华
网站建设 2026/5/23 1:56:05

国产操作系统也能玩转Python?银河麒麟+miniconda环境配置全攻略

国产操作系统也能玩转Python&#xff1f;银河麒麟miniconda环境配置全攻略 在信息技术自主可控的大背景下&#xff0c;国产操作系统正逐步进入开发者的视野。银河麒麟作为国产操作系统的代表之一&#xff0c;其稳定性和安全性已得到广泛验证。但对于习惯了Windows或macOS的开发…

作者头像 李华
网站建设 2026/5/23 1:55:50

Java开发者AI入门:在PyTorch 2.8镜像中调用深度学习模型

Java开发者AI入门&#xff1a;在PyTorch 2.8镜像中调用深度学习模型 1. 为什么Java开发者需要了解AI 作为一名Java开发者&#xff0c;你可能已经注意到AI技术正在改变软件开发的格局。从智能推荐系统到自动化测试&#xff0c;AI能力正在成为现代应用的标准配置。好消息是&…

作者头像 李华
网站建设 2026/5/23 1:55:46

基于增量动力分析方法(IDA)的易损性曲线Matlab求解代码源文件

基于增量动力分析方法IDA求解易损性曲线matlab代码&#xff0c;代码源文件 打开MATLAB顺手把咖啡杯往右挪了挪&#xff0c;突然想记录下最近折腾IDA分析的那段日子。易损性曲线这玩意儿看着简单&#xff0c;实操起来各种细节能把人逼疯。直接上干货&#xff0c;先说清楚咱这个…

作者头像 李华
网站建设 2026/5/23 1:55:48

Video-subtitle-remover:让视频创作者实现硬字幕无痕去除的AI解决方案

Video-subtitle-remover&#xff1a;让视频创作者实现硬字幕无痕去除的AI解决方案 【免费下载链接】video-subtitle-remover 基于AI的图片/视频硬字幕去除、文本水印去除&#xff0c;无损分辨率生成去字幕、去水印后的图片/视频文件。无需申请第三方API&#xff0c;本地实现。A…

作者头像 李华