03-动态规划
type
status
date
slug
summary
tags
category
icon
password
动态规划(Dynamic Programming,简称 DP)是一种用于解决具有重叠子问题和最优子结构问题的算法设计思想。它通过保存子问题的中间结果,避免重复计算,从而大大提高效率。
特性 | 说明 |
重叠子问题 | 大问题可分解为多个相同的小问题 |
最优子结构 | 大问题的最优解由子问题的最优解构成 |
状态转移方程 | 当前状态依赖于之前的状态(核心) |
记忆/表格法 | 使用数组保存子问题解,避免重复计算 |
- 定义状态: 明确
dp[i]
的含义
- 状态转移方程: 找出
dp[i]
和子问题dp[j]
的关系
- 初始化: 设定
dp[0]
,dp[1]
等边界值
- 计算顺序: 通常是从小到大逐步推导
- 返回值: 返回最终问题的解(如
dp[n]
)
1️⃣ 斐波那契数列(自顶向下 vs 自底向上)
1.自顶向下(递归+记忆化搜索)
2.自底向上(动态规划迭代实现)
1.数组存储所有结果
2.仅保存前两项,优化空间
2️⃣ 最大子序和
给定一个整数数组
nums
,找到一个具有最大和的连续子数组(至少包含一个元素),返回其最大和。输入:
[-2,1,-3,4,-1,2,1,-5,4]
输出:
6
解释: 连续子数组
[4,-1,2,1]
的和最大,为6
。示例步骤分析(输入:
[-2,1,-3,4,-1,2,1,-5,4]
)i | nums[i] | currSum(当前最大和) | maxSum(全局最大) |
0 | -2 | -2 | -2 |
1 | 1 | max(1, -2+1) = 1 | max(-2, 1) = 1 |
2 | -3 | max(-3, 1-3) = -2 | max(1, -2) = 1 |
3 | 4 | max(4, -2+4) = 4 | max(1, 4) = 4 |
4 | -1 | max(-1, 4-1) = 3 | max(4, 3) = 4 |
5 | 2 | max(2, 3+2) = 5 | max(4, 5) = 5 |
6 | 1 | max(1, 5+1) = 6 | max(5, 6) = 6 |
7 | -5 | max(-5, 6-5) = 1 | max(6, 1) = 6 |
8 | 4 | max(4, 1+4) = 5 | max(6, 5) = 6 |
3️⃣ 背包问题(01 背包)
给定
n
个物品和一个容量为 W
的背包,每个物品有:- 重量
w[i]
- 价值
v[i]
目标:
从中选择若干个物品放入背包,在不超过背包容量的前提下,使得总价值最大。
4️⃣ 编辑距离
上一篇
02-查找算法
下一篇
04-贪心算法
Loading...