Fine tune.

This commit is contained in:
krahets
2023-07-31 03:27:26 +08:00
parent f7b827b303
commit dbe3b4d6ba
7 changed files with 14 additions and 15 deletions

View File

@ -66,7 +66,7 @@
=== "<4>"
![hanota_f3_step4](hanota_problem.assets/hanota_f3_step4.png)
本质上看,**我们将问题 $f(3)$ 划分为两个子问题 $f(2)$ 和子问题 $f(1)$** 。按顺序解决这三个子问题之后,原问题随之得到解决。这说明子问题是独立的,且解是可以合并的。
本质上看,**我们将问题 $f(3)$ 划分为两个子问题 $f(2)$ 和子问题 $f(1)$** 。按顺序解决这三个子问题之后,原问题随之得到解决。这说明子问题是独立的,且解是可以合并的。
至此,我们可总结出汉诺塔问题的分治策略:将原问题 $f(n)$ 划分为两个子问题 $f(n-1)$ 和一个子问题 $f(1)$ 。子问题的解决顺序为:

View File

@ -1,9 +1,9 @@
# 动态规划问题特性
在上节中,我们学习了动态规划是如何通过子问题分解来求解问题的。实际上,子问题分解是一种通用的算法思路,在分治、动态规划、回溯中各有特点
在上节中,我们学习了动态规划是如何通过子问题分解来求解问题的。实际上,子问题分解是一种通用的算法思路,在分治、动态规划、回溯中的侧重点不同
- 「分治算法」递归地将原问题划分为多个相独立的子问题,直至最小子问题,并在回溯中合并子问题的解,最终得到原问题的解。
- 「动态规划」也对问题进行递归分解,但与分治算法的主要区别是,**动态规划中的子问题往往不是相互独立的**,原问题的解依赖于子问题的解,而子问题的解又依赖于更小的子问题的解
- 「分治算法」递归地将原问题划分为多个相独立的子问题,直至最小子问题,并在回溯中合并子问题的解,最终得到原问题的解。
- 「动态规划」也对问题进行递归分解,但与分治算法的主要区别是,动态规划中的子问题是相互依赖的,在分解过程中会出现许多重叠子问题。
- 「回溯算法」在尝试和回退中穷举所有可能的解,并通过剪枝避免不必要的搜索分支。原问题的解由一系列决策步骤构成,我们可以将每个决策步骤之前的子序列看作为一个子问题。
实际上,动态规划常用来求解最优化问题,它们不仅包含重叠子问题,还具有另外两大特性:最优子结构、无后效性。

View File

@ -128,7 +128,7 @@ $$
dp[i] = dp[i-1] + dp[i-2]
$$
这意味着在爬楼梯问题中,**各个子问题之间不是相互独立的,原问题的解可以子问题的解构建得来**。
这意味着在爬楼梯问题中,各个子问题之间存在递推关系,**原问题的解可以子问题的解构建得来**。
![方案数量递推关系](intro_to_dynamic_programming.assets/climbing_stairs_state_transfer.png)

View File

@ -22,7 +22,7 @@
本书主要内容包括:
- **复杂度分析**:数据结构和算法的评价维度,算法效率的评估方法。时间复杂度、空间复杂度的推算方法、常见类型、示例等。
- **复杂度分析**:数据结构和算法的评价维度方法。时间复杂度、空间复杂度的推算方法、常见类型、示例等。
- **数据结构**:基本数据类型,数据结构的分类方法。数组、链表、栈、队列、散列表、树、堆、图等数据结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。
- **算法**:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤、示例题目等。