在正式介绍动态规划之前,应当先回顾了分治,回溯和递归。在课上讲到,“动态规划”和前面三者其实没有本质区别,都是把问题进行拆分,寻找规律。比如分治其实是递归的特殊形式,很多题目子问题都是有自相似性的,关键在于怎么把大问题分解成小的子问题。
养成数学归纳法思想,也就是先把基础条件想明白然后解决,比如n=1怎么样,n=2的时候又怎么样,然后推导到n和n+1的情况。数学归纳法的思想好比是爆竹,想要整串都能爆炸,我们需要推导所有的最后都能爆炸。
动态规划具体是什么意思?有一个例子其实很生动。比如我们在纸上写了很多个”1+1+1+1+1…”,第一眼看过去,谁都不能知道到底写了多少个1.但是如果我们已经计算好了比如之前一共写了8个1,那么只要再写一个1,我们马上就知道现在一共写了9个1,这就是动态规划。
动态规划是一个能够让我们“记忆”之前的成果并且把它们运用在后面的运算中的一个方法,能够让程序“记住”之前所得到的答案
。动态规划可以说是用空间换时间的一种方式。
对于一个动态规划问题,我们往往需要从两个方面进行考虑,即:
找出问题之间的联系
以及
记录答案
。这里的难点实际是找出问题之间的联系,因为记录答案可以用比较简单的数据结构顺带完成。
解决动态规划问题一般需要四个步骤:
- 问题拆解,找到问题之间的具体联系
- 状态定义
- 递推方程推导
- 代码实现
上述步骤中前两步是最关键的。如果前两步骤顺利完成,后面递推方程的推导是非常简单的。尤其对于面试题,只要找到了合适的状态定义,递推方程往往不会很难,竞赛的话递推方程就可能比较难了。
版权声明:本文为wangyan12313原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。