动态规划

动态规划是一种分阶段求解决策问题的数学思想,即“大事化小,小事化了”。

比如走楼梯问题,一个楼梯有10级,每次只能走一级或两级,问:共有多少种走法?

如果最后到第10级,那么最后一步就是由8-10或者9-10,设由0-8共X种走法,0-9共Y种走法,那么0-10走法=X+Y,即F(10)=F(9)+F(8)

依次类推,F(9)=F(8)+F(7)...

当只有1级台阶和两阶台阶时,分别是1或2种走法。

由此,可以归纳出:

F(1)=1
F(2)=2
F(n)=F(n-1)+F(n-2) n>=3

动态规划中包含三个重要概念:最优子结构、边界、状态转移公式。

以上,F(9)和F(8)是F(10)的最优子结构。

当只有1级或2级台阶时,可以直接得出结果,不需要继续简化。称F(1)和F(2)是问题的边界。如果一个问题没有边界,将永远无法得到有限结果。

F(n)=F(n-1)+F(n-2)是阶段与阶段间的状态转移方程。这也是动态规划的核心,决定了问题的每一阶段和下一阶段的关系。

以上只是建模

对于求解,如果直接拿模型来解:

这是一棵二叉树,时间复杂度近似地看作是o(2^N)

之所以时间复杂度如此大,因为有些相同的参数被重复计算了

如何解决呢?用缓存,先创建一个哈希表,每次将不同的参数的计算结果存进去。后面当遇到相同参数时,从中取出,就不用重复计算。这种暂存计算结果的方式叫“备忘录算法”。此时时间复杂度是o(N),空间复杂度也是o(N)。

如何再一步优化?

我们是否一定需要对F(N)自顶向下做递归运算吗?可不可以自底向上,用迭代方式推导出结果?

例如当台阶是4时,走法数量是5,由F(2)+F(3)所得,即F(4)只依赖于F(2)和F(3)

即每一次迭代过程中,只需要保留之前两个状态,就可以推导出新的转态,大大节省了空间。这就是动态规划。

但动态规划的本质不在于是递推或是递归,即动态规划中递推式的求解方法不是动态规划的本质,也不需要纠结是不是内存换时间。

动态规划的本质,是对问题状态的定义和状态转移方程的定义。

动态规划是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。如何拆分问题,才是动态规划的核心。而拆分问题,靠的就是状态的定义和状态转移方程的定义。

参考资料:
1.漫画:什么是动态规划?
2.什么是动态规划?动态规划的意义是什么?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章