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

hot 100 | 一文讲清动态规划

文章目录

  • 动态规划(DP)简明理解与推导
    • 一、核心概念
    • 二、通用五步模板
    • 三、例题一:爬楼梯(Climbing Stairs)
      • 思路分析
      • 推导过程
      • Java代码
    • 四、例题二:最大子数组和(Maximum Subarray)
      • 思路分析
      • 推导过程
      • Java代码
    • 五、例题三:0-1 背包问题(Knapsack)
      • 思路分析
      • 推导过程
      • Java代码
    • 六、一句话总结


动态规划(DP)简明理解与推导

一、核心概念

动态规划(Dynamic Programming, DP) 是一种算法思想:

把大问题拆成多个子问题,通过记忆化保存子问题的解,逐步推导出全局最优解。

一句话总结:

DP = 状态定义 + 状态转移 + 初始化 + 遍历顺序 + 答案输出


二、通用五步模板

步骤内容示例
明确状态dp[i] 表示第 i 个位置的最优值
状态转移根据前面状态推出当前
初始化最小子问题直接给值
遍历顺序通常从小到大
输出结果dp[n-1]max(dp)

三、例题一:爬楼梯(Climbing Stairs)

每次可以爬 1 或 2 个台阶,问爬上第 n 级有几种方法?

思路分析

要到达第 i 级,有两种可能:

  • i-1 级迈一步;
  • i-2 级迈两步。
    所以:
    [
    dp[i] = dp[i-1] + dp[i-2]
    ]

推导过程

i含义推导公式结果
1只有一种方法(1步)dp[1] = 11
21+1 或 2步dp[2] = 22
3dp[2] + dp[1]2+13
4dp[3] + dp[2]3+25
5dp[4] + dp[3]5+38

Java代码

class Solution {public int climbStairs(int n) {if (n <= 2) return n;int[] dp = new int[n + 1];dp[1] = 1; dp[2] = 2;for (int i = 3; i <= n; i++) {dp[i] = dp[i-1] + dp[i-2];}return dp[n];}
}

结果示例: n=5 → 输出 8。
时间复杂度:O(n)空间复杂度:O(n)


四、例题二:最大子数组和(Maximum Subarray)

给定数组,找出和最大的连续子数组。

思路分析

定义 dp[i]:以第 i 个元素结尾的最大连续子数组和。
状态转移:
[
dp[i] = \max(nums[i], dp[i-1] + nums[i])
]

解释:

  • 如果前面的和 dp[i-1] 是负数,丢掉重开;
  • 否则接着加上当前数。

推导过程

以数组 [-2,1,-3,4,-1,2,1,-5,4] 为例:

inums[i]计算dp[i]当前最大
0-2初始-2-2
11max(1, -2+1)11
2-3max(-3, 1-3)-21
34max(4, -2+4)44
4-1max(-1, 4-1)34
52max(2, 3+2)55
61max(1, 5+1)66
7-5max(-5, 6-5)16
84max(4, 1+4)56

最终最大值 = 6(来自子数组 [4, -1, 2, 1])

Java代码

class Solution {public int maxSubArray(int[] nums) {int currentSum = nums[0], maxSum = nums[0];for (int i = 1; i < nums.length; i++) {currentSum = Math.max(nums[i], currentSum + nums[i]);maxSum = Math.max(maxSum, currentSum);}return maxSum;}
}

时间复杂度:O(n)
空间复杂度:O(1)


五、例题三:0-1 背包问题(Knapsack)

有 n 个物品和容量为 C 的背包,每个物品有重量 w[i]、价值 v[i]。
每个物品最多选一次,求最大价值。

思路分析

dp[j] = 背包容量为 j 时的最大价值。
对于第 i 个物品:

  • 不放:价值不变;
  • 放:容量减少 w[i],价值增加 v[i]。

转移公式:
[
dp[j] = \max(dp[j], dp[j - w[i]] + v[i])
]

推导过程

假设容量 C=5,物品:

物品重量价值
A23
B34
C45

计算:
放 A → dp[2]=3
放 B → dp[3]=4
放 C → dp[4]=5
继续组合:

  • 放 A+B:容量5 → 3+4=7 ✅
  • 放 A+C:容量6>5 ❌
    最大价值 = 7。

Java代码

class Solution {public int knapsack(int[] w, int[] v, int C) {int[] dp = new int[C + 1];for (int i = 0; i < w.length; i++) {for (int j = C; j >= w[i]; j--) {dp[j] = Math.max(dp[j], dp[j - w[i]] + v[i]);}}return dp[C];}
}

时间复杂度:O(n*C)
空间复杂度:O©


六、一句话总结

动态规划就是:
先确定状态,再找递推规律,最后一层层推到答案。


http://www.dtcms.com/a/495316.html

相关文章:

  • 操作简单稳定选巨 椰 云手机
  • 设计模式之:工厂方法模式
  • 西宁市精神文明建设网站餐饮店面装饰设计
  • 对营销网站建设评估及分析佛山顺德做网站
  • 高并发系统架构设计原则:无状态、水平扩展、异步化、缓存优先
  • 系统架构设计师备考第45天——软件架构演化评估方法和维护
  • 基于SpringBoot+Vue的社区诊所管理系统(AI问答、webSocket实时聊天、Echarts图形化分析)
  • 【MySQL】第二章 基本的SELECT语句
  • Linux中软中断tasklet任务队列初始化
  • 网站制作的重要流程世界优秀摄影作品网站
  • 技术剖析:智能体工作流与RPA流程自动化的架构差异与融合实现
  • 深圳比斯特自动化|圆柱电池测试设备核心功能与技术发展解析
  • 【软考备考】系统架构设计需要考虑的因素 性能 、安全、成本、可维护性详解知识点五
  • 面试反馈 Spring Cloud 的25连环炮
  • 第八篇: `lsmod`, `modinfo`, `modprobe` - 深入内核模块
  • aspx网站服务器失去响应天工网工程新希望官网
  • 网站服务器要多少钱【邯郸网络推广公司|邯郸网络营销公司】
  • 做网站用什么域名比较好找公司开发网站
  • 【Python】求解GPS未知及高斯噪声
  • Linux 教程:如何查找服务器中的大文件
  • 计算机网络基础篇——应用层
  • 2025年主流外贸管理软件深度测评和选型策略咨询报告
  • 玩Android Harmony next版,通过项目了解harmony项目快速搭建开发
  • 公司免费网站域名申请免费网址
  • 华为鲲鹏 Aarch64 环境下多 Oracle 数据库汇聚操作指南 CMP(类 Cloudera CDP 7.3)
  • Chromedriver放项目里就行!Selenium 3 和 4 指定路径方法对比 + 兼容写法
  • Spring Boot 项目, idea 控制台日志设置彩色
  • wap网站建设好不好百度小程序官方收费标准
  • Go语言数据竞争Data Race 问题怎么检测?怎么解决?
  • 作为项目经理,如何做好项目复盘?