Skip to content

Latest commit

 

History

History

topic4_dynamic_planning_study

动态规划套路详解

1 算法思想

动态规划算法与分治法类似,其基本思想也是将待求的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

2 算法求解步骤

  1. 将原问题分解为子问题。把原问题分解为若干个子问题,子问题和原问题形式相同或类似,只不过规模变小了。子问题都解决,原问题即解决。子问题的解一旦求出就会被保存,所以每个子问题只需求解一次;

  2. 确定状态。在用动态规划解题时,我们往往将和子问题相关的各个变量的一组取值,称之为一个“状 态”。一个“状态”对应于一个或多个子题, 所谓某个“状态”下的“值”,就是这个“状态”所对应的子问题的解。所有“状态”的集合,构成问题的“状态空间”。“状态空间”的大小,与用动态规划解决问题的时间复杂度直接相关。整个问题的时间复杂度是状态数目乘以计算每个状态所需时间;

  3. 确定一些初始状态(边界状态)的值;

  4. 确定状态转移方程。定义出什么是“状态”,以及在该“状态”下的“值”后,就要找出不同的状态之间如何迁移――即如何从一个或多个“值”已知的 “状态”,求出另一个“状态”的“值”(递推型)。状态的迁移可以用递推公式表示,此递推公式也可被称作“状态转移方程”。

3 算法适合条件

  1. 能用动态规划解决的问题的特点

    1. 问题具有最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质。

    2. 无后效性。当前的若干个状态值一旦确定,则此后过程的演变就只和这若干个状态的值有关,与之前是采取哪种手段或经过哪条路径演变到当前的这若干个状态没有关系。

  2. 递归到动态规划的一般转化

递归函数有个参数,就定义一个维的数组,数组的下标是递归函数参数的取值范围,数组元素的值是递归函数的返回值,这样就可以从边界值开始,逐步填充数组,相当于计算递归函数值的逆过程。

参考

  1. 动态规划套路详解