This commit is contained in:
krahets
2023-08-20 13:37:08 +08:00
parent 2e27ad1680
commit 44a8568356
32 changed files with 140 additions and 130 deletions
@@ -102,7 +102,7 @@ $$
根据以上分析,我们已经可以直接写出动态规划代码。然而子问题分解是一种从顶至底的思想,因此按照“暴力搜索 $\rightarrow$ 记忆化搜索 $\rightarrow$ 动态规划”的顺序实现更加符合思维习惯。
### 方法一:暴力搜索
### 1.   方法一:暴力搜索
从状态 $[i, j]$ 开始搜索,不断分解为更小的状态 $[i-1, j]$ 和 $[i, j-1]$ ,包括以下递归要素:
@@ -326,7 +326,7 @@ $$
每个状态都有向下和向右两种选择,从左上角走到右下角总共需要 $m + n - 2$ 步,所以最差时间复杂度为 $O(2^{m + n})$ 。请注意,这种计算方式未考虑临近网格边界的情况,当到达网络边界时只剩下一种选择。因此实际的路径数量会少一些。
### 方法二:记忆化搜索
### 2.   方法二:记忆化搜索
我们引入一个和网格 `grid` 相同尺寸的记忆列表 `mem` ,用于记录各个子问题的解,并将重叠子问题进行剪枝。
@@ -588,7 +588,7 @@ $$
<p align="center"> 图:记忆化搜索递归树 </p>
### 方法三:动态规划
### 3. &nbsp; 方法三:动态规划
基于迭代实现动态规划解法。
@@ -895,7 +895,7 @@ $$
<p align="center"> 图:最小路径和的动态规划过程 </p>
### 状态压缩
### 4. &nbsp; 状态压缩
由于每个格子只与其左边和上边的格子有关,因此我们可以只用一个单行数组来实现 $dp$ 表。