核心认知
动态规划不是一套固定模板,而是一种建模方式。 它真正要解决的问题是:- 大问题可以拆成小问题
- 小问题会重复出现
- 已经算过的结果不要重复算
做动态规划时最先想什么
很多人上来就想转移方程,其实顺序反了。 更稳定的顺序通常是:dp数组表示什么- 初始状态是什么
- 当前状态由谁转移而来
- 遍历顺序应该怎么安排
一个最基础的 Python 例子
爬楼梯是最适合入门 DP 的题之一。dp[i]表示到达第i阶台阶的方法数
动态规划为什么难
动态规划的难点通常集中在这几件事:- 状态定义不清楚
- 转移漏情况
- 初始化不对
- 遍历顺序写反
常见题型
动态规划题通常可以分成这些方向:- 线性 DP
- 背包问题
- 子序列问题
- 区间 DP
- 树形 DP
- 状态压缩 DP
- 线性 DP
- 01 背包
- 子序列问题
动态规划和递归的关系
很多 DP 问题都可以先写成递归。 然后你会发现一些子问题会重复计算,于是:- 加缓存,就是记忆化搜索
- 改成迭代,就是自底向上的动态规划
动态规划和贪心的区别
贪心在问:- 这一步怎么选最优
- 当前状态如何由之前状态推出来
学习建议
建议按这个顺序练:- 爬楼梯
- 打家劫舍
- 不同路径
- 01 背包
- 最长递增子序列
- 最长公共子序列
dp[i] 的定义”,动态规划就会从抽象变得具体。
