为什么动态规划很重要
DP 通过将优化问题分解为重叠子问题来求解——避免重复计算:
- 优化问题:求最大/最小值
- 计数问题:计算方案数/排列数
- 字符串匹配:编辑距离、LCS
- 资源分配:背包问题、分割问题
实际影响:
- 计算 Fibonacci(50):
- 朴素递归:2⁵⁰ ≈ 10¹⁵ 次运算(数小时)
- DP 记忆化:50 次运算(瞬间完成)
- 快 10 万亿倍
- 生物信息学中的序列比对(DNA 比较)使用 DP
核心概念
DP 解题套路
- 定义子问题:什么更小的问题能构建解?
- 状态定义:哪些参数标识子问题?
- 递推关系:如何组合子问题的解?