Add subtitles to docs

This commit is contained in:
krahets
2023-07-21 21:54:51 +08:00
parent 1a55dbdf2e
commit ca5bde2b6c
16 changed files with 109 additions and 35 deletions

View File

@@ -49,7 +49,7 @@ $$
完成以上三步后,我们可以直接实现从底至顶的动态规划解法。而为了展示本题包含的重叠子问题,本文也同时给出从顶至底的暴力搜索和记忆化搜索解法。
## 方法一:暴力搜索
### 方法一:暴力搜索
搜索代码包含以下要素:
@@ -129,7 +129,7 @@ $$
![0-1 背包的暴力搜索递归树](knapsack_problem.assets/knapsack_dfs.png)
## 方法二:记忆化搜索
### 方法二:记忆化搜索
为了防止重复求解重叠子问题,我们借助一个记忆列表 `mem` 来记录子问题的解,其中 `mem[i][c]` 对应解 $dp[i, c]$ 。
@@ -203,7 +203,7 @@ $$
![0-1 背包的记忆化搜索递归树](knapsack_problem.assets/knapsack_dfs_mem.png)
## 方法三:动态规划
### 方法三:动态规划
动态规划解法本质上就是在状态转移中填充 $dp$ 表的过程,代码如下所示。
@@ -317,7 +317,9 @@ $$
=== "<14>"
![knapsack_dp_step14](knapsack_problem.assets/knapsack_dp_step14.png)
**最后考虑状态压缩**。以上代码中的数组 `dp` 占用 $O(n \times cap)$ 空间。由于每个状态都只与其上一行的状态有关,因此我们可以使用两个数组滚动前进,将空间复杂度从 $O(n^2)$ 将低至 $O(n)$ 。代码省略,有兴趣的同学可以自行实现。
### 状态压缩
最后考虑状态压缩。以上代码中的数组 `dp` 占用 $O(n \times cap)$ 空间。由于每个状态都只与其上一行的状态有关,因此我们可以使用两个数组滚动前进,将空间复杂度从 $O(n^2)$ 将低至 $O(n)$ 。代码省略,有兴趣的同学可以自行实现。
那么,我们是否可以仅用一个数组实现状态压缩呢?观察可知,每个状态都是由正上方或左上方的格子转移过来的。假设只有一个数组,当遍历到第 $i$ 行时,该数组存储的仍然是第 $i-1$ 行的状态,**为了避免左方区域的格子在状态转移中被覆盖,应该采取倒序遍历**。