Skip to content

Commit 09f3639

Browse files
committed
更新 第 05 章动态规划篇 相关图片、图片标题
1 parent 69fa9dc commit 09f3639

32 files changed

+24
-24
lines changed

docs/ch05/05.01/05.01.01-Dynamic-Programming-Basic.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
3131
通过公式 $f(n) = f(n - 2) + f(n - 1)$,我们可以将原问题 $f(n)$ 递归地划分为 $f(n - 2)$ 和 $f(n - 1)$ 这两个子问题。其对应的递归过程如下图所示:
3232

33-
![](../../images/20230307164107.png)
33+
![斐波那契数列的重复计算项](../../images/20230307164107.png)
3434

3535
从图中可以看出:如果使用传统递归算法计算 $f(5)$,需要先计算 $f(3)$ 和 $f(4)$,而在计算 $f(4)$ 时还需要计算 $f(3)$,这样 $f(3)$ 就进行了多次计算。同理 $f(0)$、$f(1)$、$f(2)$ 都进行了多次计算,从而导致了重复计算问题。
3636

@@ -83,13 +83,13 @@ class Solution:
8383

8484
也就是说,如果原问题的最优解包含子问题的最优解,则说明该问题满足最优子结构性质。
8585

86-
![](../../images/20220511175042.png)
86+
![最优子结构性质](../../images/20240513163310.png)
8787

8888
### 2.2 重叠子问题性质
8989

9090
> **重叠子问题性质**:指的是在求解子问题的过程中,有大量的子问题是重复的,一个子问题在下一阶段的决策中可能会被多次用到。如果有大量重复的子问题,那么只需要对其求解一次,然后用表格将结果存储下来,以后使用时可以直接查询,不需要再次求解。
9191
92-
![](../../images/20230307175804.png)
92+
![重叠子问题性质](../../images/20230307164107.png)
9393

9494
之前我们提到的「斐波那契数列」例子中,$f(0)$、$f(1)$、$f(2)$、$f(3)$ 都进行了多次重复计算。动态规划算法利用了子问题重叠的性质,在第一次计算 $f(0)$、$f(1)$、$f(2)$、$f(3)$ 时就将其结果存入表格,当再次使用时可以直接查询,无需再次求解,从而提升效率。
9595

@@ -103,15 +103,15 @@ class Solution:
103103

104104
而如果一个问题具有「后效性」,则可能需要先将其转化或者逆向求解来消除后效性,然后才可以使用动态规划算法。
105105

106-
![](../../images/202303072158573.png)
106+
![无后效性](../../images/20240514110127.png)
107107

108108
## 3. 动态规划的基本思路
109109

110110
如下图所示,我们在使用动态规划方法解决某些最优化问题时,可以将解决问题的过程按照一定顺序(时间顺序、空间顺序或其他顺序)分解为若干个相互联系的「阶段」。然后按照顺序对每一个阶段做出「决策」,这个决策既决定了本阶段的效益,也决定了下一阶段的初始状态。依次做完每个阶段的决策之后,就得到了一个整个问题的决策序列。
111111

112112
这样就将一个原问题分解为了一系列的子问题,再通过逐步求解从而获得最终结果。
113113

114-
![](../../images/20220720180135.png)
114+
![动态规划方法](../../images/20240514110154.png)
115115

116116
这种前后关联、具有链状结构的多阶段进行决策的问题也叫做「多阶段决策问题」。
117117

@@ -396,4 +396,4 @@ class Solution:
396396
- 【书籍】算法训练营 陈小玉 著
397397
- 【书籍】趣学算法 陈小玉 著
398398
- 【书籍】算法竞赛进阶指南 - 李煜东 著
399-
- 【书籍】ACM-ICPC 程序设计系列 - 算法设计与实现 - 陈宇 吴昊 主编
399+
- 【书籍】ACM-ICPC 程序设计系列 - 算法设计与实现 - 陈宇 吴昊 主编

docs/ch05/05.01/05.01.04-Memoization.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
举个例子,比如「斐波那契数列」的定义是:$f(0) = 0, f(1) = 1, f(n) = f(n - 1) + f(n - 2)$。如果我们使用递归算法求解第 $n$ 个斐波那契数,则对应的递推过程如下:
1010

11-
![](../../images/20230308105357.png)
11+
![记忆化搜索](../../images/20240514110503.png)
1212

1313
从图中可以看出:如果使用普通递归算法,想要计算 $f(5)$,需要先计算 $f(3)$ 和 $f(4)$,而在计算 $f(4)$ 时还需要计算 $f(3)$。这样 $f(3)$ 就进行了多次计算,同理 $f(0)$、$f(1)$、$f(2)$ 都进行了多次计算,从而导致了重复计算问题。
1414

@@ -281,4 +281,4 @@ class Solution:
281281

282282
## 参考资料
283283

284-
1. 【文章】[记忆化搜索 - OI Wiki](https://oi-wiki.org/dp/memo/)
284+
1. 【文章】[记忆化搜索 - OI Wiki](https://oi-wiki.org/dp/memo/)

docs/ch05/05.02/05.02.01-Linear-DP-01.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
> **线性动态规划**:具有「线性」阶段划分的动态规划方法统称为线性动态规划(简称为「线性 DP」),如下图所示。
66
7-
![](../../images/202303122358154.png)
7+
![线性 DP](../../images/20240514110630.png)
88

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

@@ -744,4 +744,4 @@ class Solution:
744744
## 参考资料
745745

746746
- 【书籍】算法竞赛进阶指南
747-
- 【文章】[动态规划概念和基础线性DP | 潮汐朝夕](https://chengzhaoxi.xyz/1a4a2483.html)
747+
- 【文章】[动态规划概念和基础线性DP | 潮汐朝夕](https://chengzhaoxi.xyz/1a4a2483.html)

docs/ch05/05.03/05.03.01-Knapsack-Problem-01.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
> **背包问题**:背包问题是线性 DP 问题中一类经典而又特殊的模型。背包问题可以描述为:给定一组物品,每种物品都有自己的重量、价格以及数量。再给定一个最多能装重量为 $W$ 的背包。现在选择将一些物品放入背包中,请问在总重量不超过背包载重上限的情况下,能装入背包的最大价值总和是多少?
88
9-
![](../../images/202303191755045.png)
9+
![背包问题](../../images/20240514111553.png)
1010

1111
根据物品限制条件的不同,背包问题可分为:0-1 背包问题、完全背包问题、多重背包问题、分组背包问题,以及混合背包问题等。
1212

@@ -22,7 +22,7 @@
2222

2323
> **0-1 背包问题**:有 $n$ 件物品和有一个最多能装重量为 $W$ 的背包。第 $i$ 件物品的重量为 $weight[i]$,价值为 $value[i]$,每件物品有且只有 $1$ 件。请问在总重量不超过背包载重上限的情况下,能装入背包的最大价值是多少?
2424
25-
![](../../images/202303191759967.png)
25+
![0-1 背包问题](../../images/20240514111617.png)
2626

2727
### 2.1 0-1 背包问题基本思路
2828

@@ -269,4 +269,4 @@ class Solution:
269269
- 【资料】[背包九讲 - 崔添翼](https://github.com/tianyicui/pack)
270270
- 【文章】[背包 DP - OI Wiki](https://oi-wiki.org/dp/knapsack/)
271271
- 【文章】[背包问题 第四讲 - 宫水三叶的刷题日记](https://juejin.cn/post/7003243733604892685)
272-
- 【文章】[Massive Algorithms: 讲透完全背包算法](https://massivealgorithms.blogspot.com/2015/06/unbounded-knapsack-problem.html)
272+
- 【文章】[Massive Algorithms: 讲透完全背包算法](https://massivealgorithms.blogspot.com/2015/06/unbounded-knapsack-problem.html)

docs/ch05/05.03/05.03.02-Knapsack-Problem-02.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
> **完全背包问题**:有 $n$ 种物品和一个最多能装重量为 $W$ 的背包,第 $i$ 种物品的重量为 $weight[i]$,价值为 $value[i]$,每种物品数量没有限制。请问在总重量不超过背包载重上限的情况下,能装入背包的最大价值是多少?
66
7-
![](../../images/202303191800014.png)
7+
![完全背包问题](../../images/20240514111640.png)
88

99
### 3.1 完全背包问题基本思路
1010

@@ -244,4 +244,4 @@ class Solution:
244244
- 【文章】[背包 DP - OI Wiki](https://oi-wiki.org/dp/knapsack/)
245245
- 【文章】[背包问题 第四讲 - 宫水三叶的刷题日记](https://juejin.cn/post/7003243733604892685)
246246
- 【题解】[『 套用完全背包模板 』详解完全背包(含数学推导) - 完全平方数 - 力扣](https://leetcode.cn/problems/perfect-squares/solution/by-flix-sve5/)
247-
- 【题解】[『 一文搞懂完全背包问题 』从0-1背包到完全背包,逐层深入+推导 - 零钱兑换 - 力扣](https://leetcode.cn/problems/coin-change/solution/by-flix-su7s/)
247+
- 【题解】[『 一文搞懂完全背包问题 』从0-1背包到完全背包,逐层深入+推导 - 零钱兑换 - 力扣](https://leetcode.cn/problems/coin-change/solution/by-flix-su7s/)

docs/ch05/05.03/05.03.03-Knapsack-Problem-03.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
> **多重背包问题**:有 $n$ 种物品和一个最多能装重量为 $W$ 的背包,第 $i$ 种物品的重量为 $weight[i]$,价值为 $value[i]$,件数为 $count[i]$。请问在总重量不超过背包载重上限的情况下,能装入背包的最大价值是多少?
66
7-
![](../../images/202303191809178.png)
7+
![多重背包问题](../../images/20240514111701.png)
88

99
### 4.1 多重背包问题基本思路
1010

@@ -210,4 +210,4 @@ class Solution:
210210

211211
- 【资料】[背包九讲 - 崔添翼](https://github.com/tianyicui/pack)
212212
- 【文章】[背包 DP - OI Wiki](https://oi-wiki.org/dp/knapsack/)
213-
- 【文章】[【动态规划/背包问题】多重背包の二进制优化](https://mp.weixin.qq.com/s?__biz=MzU4NDE3MTEyMA==&mid=2247486796&idx=1&sn=a382b38f8aed295410550bb1767437bd&chksm=fd9ca653caeb2f456262bbf70ffe1eeda8758b426a901a6ac15be184e7017870020e456c6fa2&scene=178&cur_album_id=1869157771795841024#rd)
213+
- 【文章】[【动态规划/背包问题】多重背包の二进制优化](https://mp.weixin.qq.com/s?__biz=MzU4NDE3MTEyMA==&mid=2247486796&idx=1&sn=a382b38f8aed295410550bb1767437bd&chksm=fd9ca653caeb2f456262bbf70ffe1eeda8758b426a901a6ac15be184e7017870020e456c6fa2&scene=178&cur_album_id=1869157771795841024#rd)

docs/ch05/05.03/05.03.04-Knapsack-Problem-04.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
>
1111
> 请问在总重量不超过背包载重上限的情况下,能装入背包的最大价值是多少?
1212
13-
![](../../images/20230329095653.png)
13+
![混合背包问题](../../images/20240514111727.png)
1414

1515
#### 思路 1:动态规划
1616

@@ -84,7 +84,7 @@ class Solution:
8484

8585
> **分组背包问题**:有 $n$ 组物品和一个最多能装重量为 $W$ 的背包,第 $i$ 组物品的件数为 $group\underline{\hspace{0.5em}}count[i]$,第 $i$ 组的第 $j$ 个物品重量为 $weight[i][j]$,价值为 $value[i][j]$。每组物品中最多只能选择 $1$ 件物品装入背包。请问在总重量不超过背包载重上限的情况下,能装入背包的最大价值是多少?
8686
87-
![](../../images/20230329095729.png)
87+
![分组背包问题](../../images/20240514111745.png)
8888

8989
### 6.1 分组背包问题基本思路
9090

@@ -204,7 +204,7 @@ class Solution:
204204

205205
> **二维费用背包问题**:有 $n$ 件物品和有一个最多能装重量为 $W$、容量为 $V$ 的背包。第 $i$ 件物品的重量为 $weight[i]$,体积为 $volume[i]$,价值为 $value[i]$,每件物品有且只有 $1$ 件。请问在总重量不超过背包载重上限、容量上限的情况下,能装入背包的最大价值是多少?
206206
207-
![](../../images/20230329095857.png)
207+
![二维费用背包问题](../../images/20240514111802.png)
208208

209209
### 7.1 二维费用背包问题基本思路
210210

@@ -329,4 +329,4 @@ class Solution:
329329
- 【资料】[背包九讲 - 崔添翼](https://github.com/tianyicui/pack)
330330
- 【文章】[背包 DP - OI Wiki](https://oi-wiki.org/dp/knapsack/)
331331
- 【文章】[【动态规划/背包问题】分组背包问题](https://mp.weixin.qq.com/s?__biz=MzU4NDE3MTEyMA==&mid=2247487504&idx=1&sn=9ac523ec0ac14c8634a229f8c3f919d7&chksm=fd9cbb0fcaeb32196b80a40e4408f6a7e2651167e0b9e31aa6d7c6109fbc2117340a59db12a1&token=1936267333&lang=zh_CN&scene=21#wechat_redirect)
332-
- 【文章】[【动态规划/背包问题】背包问题第一阶段最终章:混合背包问题](https://mp.weixin.qq.com/s?__biz=MzU4NDE3MTEyMA==&mid=2247487034&idx=1&sn=eaa05b76387d34aa77f7f14f35fa78a4&chksm=fd9ca525caeb2c33095d285222dcee0dd072465bf7288bda0aab39e90a04bb7b1af018b89fd4&token=1872331648&lang=zh_CN&scene=21#wechat_redirect)
332+
- 【文章】[【动态规划/背包问题】背包问题第一阶段最终章:混合背包问题](https://mp.weixin.qq.com/s?__biz=MzU4NDE3MTEyMA==&mid=2247487034&idx=1&sn=eaa05b76387d34aa77f7f14f35fa78a4&chksm=fd9ca525caeb2c33095d285222dcee0dd072465bf7288bda0aab39e90a04bb7b1af018b89fd4&token=1872331648&lang=zh_CN&scene=21#wechat_redirect)

docs/ch05/05.03/05.03.05-Knapsack-Problem-05.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,4 +326,4 @@ class Solution:
326326
- 【文章】[背包 DP - OI Wiki](https://oi-wiki.org/dp/knapsack/)
327327
- 【文章】[背包问题——“01背包”最优方案总数分析及实现 - wumuzi 的博客](https://blog.csdn.net/wumuzi520/article/details/7019131)
328328
- 【文章】[背包问题——“完全背包”最优方案总数分析及实现 - wumuzi的博客](https://blog.csdn.net/wumuzi520/article/details/7019661)
329-
- 【文章】[背包问题——“01背包”及“完全背包”装满背包的方案总数分析及实现 - wumuzi的博客](https://blog.csdn.net/wumuzi520/article/details/7021210)
329+
- 【文章】[背包问题——“01背包”及“完全背包”装满背包的方案总数分析及实现 - wumuzi的博客](https://blog.csdn.net/wumuzi520/article/details/7021210)

docs/ch05/05.04/05.04.05-Tree-DP.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
> **树形动态规划**:简称为「树形 DP」,是一种在树形结构上进行推导的动态规划方法。如下图所示,树形 DP 的求解过程一般以节点从深到浅(子树从小到大)的顺序作为动态规划的「阶段」。在树形 DP 中,第 $1$ 维通常是节点编号,代表以该节点为根的子树。
66
7-
![](../../images/20230418114342.png)
7+
![树形 DP](../../images/20240514113355.png)
88

99
树形 DP 问题的划分方法有多种方式。
1010

@@ -398,4 +398,4 @@ class Solution:
398398

399399
- 【题解】[C++ 容易理解的换根动态规划解法 - 最小高度树](https://leetcode.cn/problems/minimum-height-trees/solution/c-huan-gen-by-vclip-sa84/)
400400
- 【题解】[310. 最小高度树 - 最小高度树 - 力扣](https://leetcode.cn/problems/minimum-height-trees/solution/310-zui-xiao-gao-du-shu-by-vincent-40-teg8/)
401-
- 【题解】[310. 最小高度树 - 最小高度树 - 力扣](https://leetcode.cn/problems/minimum-height-trees/solution/310-zui-xiao-gao-du-shu-by-vincent-40-teg8/)
401+
- 【题解】[310. 最小高度树 - 最小高度树 - 力扣](https://leetcode.cn/problems/minimum-height-trees/solution/310-zui-xiao-gao-du-shu-by-vincent-40-teg8/)

docs/images/20220720180135.png

-22.4 KB
Binary file not shown.

0 commit comments

Comments
 (0)