返回全部文章

动态规划为什么总让人感觉“会看不会做”

动态规划是很多人算法学习里的分水岭。

动态规划是很多人算法学习里的分水岭。

不是因为它一定最难,而是因为它特别容易出现一种状态:

看题解觉得有道理,自己做却还是不会。

动态规划难在哪里

很多方法难在实现,动态规划更常难在“建模”。

你要同时想清楚这些问题:

  • 状态怎么定义
  • 转移从哪里来
  • 初始条件是什么
  • 结果取哪一个状态

如果这些问题里有一个没想清楚,整个方法就会很虚。

为什么会“会看不会做”

因为很多时候你记住的是转移方程,而不是转移为什么成立。

比如你看到:

dp[i] = max(dp[i - 1], dp[i - 2] + value[i])

你也许能背下来,但如果没有理解:

  • 为什么状态只需要定义到这里
  • 为什么这两个选项已经覆盖所有情况

下一道题一换壳,你就失去入口了。

一个更稳的学习方式

先从状态含义开始

不要一上来写方程,先写一句中文:

dp[i] 表示什么?

如果这句话你写不清楚,后面大概率也会乱。

再问转移为什么完整

很多人会写转移,但没想过:

  • 这个转移有没有漏情况
  • 这些情况为什么互斥
  • 为什么所有可能都被覆盖到了

只有把“完整性”想清楚,动态规划才不会只是套公式。

最后才是实现

实现其实经常不是最难的部分。
真正难的是在写代码之前,先把问题结构解释清楚。

动态规划和其他方法最大的区别

我觉得它最特别的一点是:

它要求你把一个问题拆成“状态之间的关系”,而不是只盯着最终答案。

这也是为什么一旦动态规划学通,你的建模能力会整体提升。

结论

动态规划让人觉得“会看不会做”,通常不是因为太复杂,而是因为:

你记住了结果,却还没有真正理解状态是怎么被建立起来的。

一旦你开始从“状态含义”和“转移完整性”去思考,很多题会变得清楚得多。