mirror of
https://github.com/krahets/hello-algo.git
synced 2026-04-05 03:30:30 +08:00
Add subtitles to docs
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
|
||||
如果一个问题满足决策树模型,并具有较为明显的“加分项“,我们就可以假设它是一个动态规划问题,并尝试求解它。
|
||||
|
||||
## 问题求解
|
||||
## 问题求解步骤
|
||||
|
||||
动态规划的解题流程可能会因问题的性质和难度而有所不同,但通常遵循以下步骤:描述决策,定义状态,建立 $dp$ 表,推导状态转移方程,确定边界条件等。
|
||||
|
||||
@@ -87,7 +87,7 @@ $$
|
||||
|
||||
接下来,我们就可以实现动态规划代码了。然而,由于子问题分解是一种从顶至底的思想,因此按照“暴力搜索 $\rightarrow$ 记忆化搜索 $\rightarrow$ 动态规划”的顺序实现更加符合思维习惯。
|
||||
|
||||
## 方法一:暴力搜索
|
||||
### 方法一:暴力搜索
|
||||
|
||||
从状态 $[i, j]$ 开始搜索,不断分解为更小的状态 $[i-1, j]$ 和 $[i, j-1]$ ,包括以下递归要素:
|
||||
|
||||
@@ -169,7 +169,7 @@ $$
|
||||
|
||||
每个状态都有向下和向右两种选择,从左上角走到右下角总共需要 $m + n - 2$ 步,所以最差时间复杂度为 $O(2^{m + n})$ 。请注意,这种计算方式未考虑临近网格边界的情况,当到达网络边界时只剩下一种选择。因此实际的路径数量会少一些。
|
||||
|
||||
## 方法二:记忆化搜索
|
||||
### 方法二:记忆化搜索
|
||||
|
||||
为了避免重复计算重叠子问题,我们引入一个和网格 `grid` 相同尺寸的记忆列表 `mem` ,用于记录各个子问题的解,提升搜索效率。
|
||||
|
||||
@@ -243,7 +243,7 @@ $$
|
||||
|
||||

|
||||
|
||||
## 方法三:动态规划
|
||||
### 方法三:动态规划
|
||||
|
||||
动态规划代码是从底至顶的,仅需循环即可实现。
|
||||
|
||||
@@ -351,6 +351,8 @@ $$
|
||||
=== "<12>"
|
||||

|
||||
|
||||
### 状态压缩
|
||||
|
||||
如果希望进一步节省空间使用,可以考虑进行状态压缩。每个格子只与左边和上边的格子有关,因此我们可以只用一个单行数组来实现 $dp$ 表。
|
||||
|
||||
由于数组 `dp` 只能表示一行的状态,因此我们无法提前初始化首列状态,而是在遍历每行中更新它。
|
||||
|
||||
Reference in New Issue
Block a user