算法思想
dynamic programming is a method for solving a complex problem by breaking it down into a collection of simpler subproblems.——维基百科
动态规划的思想:将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。
动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存下来,即空间换时间。
算法本质
动态规划的本质(核心),是对问题状态的定义和状态转移方程的定义,也可以用非数学的话来描述:原问题的解如何由子问题的解组合而成。
考察一个实际问题:
斐波那契数列:1、1、2、3、5、8、13、21、34、……
数学定义:F(0)=1,F(1)=1,F(2)=2,……, F(n)=F(n-1)+F(n-2)
上述的F(n)就是一个子问题,也就可以叫做状态,定义”F(n)为斐波那契数列的第n个数“,就叫做状态的定义。
而对于数学方程F(n)=F(n-1)+F(n-2),可以理解为从状态F(n-1)和F(n-2)转移到状态F(n),而这样的方程的定义就叫做状态转移方程的定义。
在对状态和状态转移方程的定义过程中,满足“最优子结构”是一个隐含的条件(否则根本定义不出来)。