动态规划为什么总让人感觉“会看不会做”
动态规划是很多人算法学习里的分水岭。
动态规划是很多人算法学习里的分水岭。
不是因为它一定最难,而是因为它特别容易出现一种状态:
看题解觉得有道理,自己做却还是不会。
动态规划难在哪里
很多方法难在实现,动态规划更常难在“建模”。
你要同时想清楚这些问题:
- 状态怎么定义
- 转移从哪里来
- 初始条件是什么
- 结果取哪一个状态
如果这些问题里有一个没想清楚,整个方法就会很虚。
为什么会“会看不会做”
因为很多时候你记住的是转移方程,而不是转移为什么成立。
比如你看到:
dp[i] = max(dp[i - 1], dp[i - 2] + value[i])
你也许能背下来,但如果没有理解:
- 为什么状态只需要定义到这里
- 为什么这两个选项已经覆盖所有情况
下一道题一换壳,你就失去入口了。
一个更稳的学习方式
先从状态含义开始
不要一上来写方程,先写一句中文:
dp[i] 表示什么?
如果这句话你写不清楚,后面大概率也会乱。
再问转移为什么完整
很多人会写转移,但没想过:
- 这个转移有没有漏情况
- 这些情况为什么互斥
- 为什么所有可能都被覆盖到了
只有把“完整性”想清楚,动态规划才不会只是套公式。
最后才是实现
实现其实经常不是最难的部分。
真正难的是在写代码之前,先把问题结构解释清楚。
动态规划和其他方法最大的区别
我觉得它最特别的一点是:
它要求你把一个问题拆成“状态之间的关系”,而不是只盯着最终答案。
这也是为什么一旦动态规划学通,你的建模能力会整体提升。
结论
动态规划让人觉得“会看不会做”,通常不是因为太复杂,而是因为:
你记住了结果,却还没有真正理解状态是怎么被建立起来的。
一旦你开始从“状态含义”和“转移完整性”去思考,很多题会变得清楚得多。