正文
动态规划(Dynamic Programming)的核心思想是将复杂问题分解为重复的子问题。自顶向下法(Top-Down)通常结合递归与备忘录(Memoization),这种方法也被称为“记忆化搜索”。
算法模板 (以斐波那契数列为例)
1 | fun solve(n: Int): Int { |
使用说明
核心逻辑:
- 递归(自顶向下):从最终目标出发,逐层分解直到最简单的基础情况。
- 备忘录(记忆化):为了避免重复计算(如斐波那契中多次计算同样的
f(n-2)),将结果保存在数组或哈希表中。
核心优势:
- 逻辑清晰:比自底向上的迭代(Tabulation)更容易推导出状态转移关系。
- 按需计算:只计算解决原问题所需要的子问题,而迭代法通常会计算整个表格。
适用场景:
- 问题的状态转移方程非常明确。
- 存在大量重叠子问题。
- 递归树深度在可控范围内(避免栈溢出)。
注意点:
- 初始化:备忘录的初始值必须是一个在该问题结果中不可能出现的值。
- 栈空间:如果
n非常大(如超过 10,000),递归可能会引发StackOverflowError,此时需改用自底向上的迭代法。 - 状态设计:动态规划最难的是如何定义
dp函数的含义。