您的位置:首页 > 其它

DP 动态规划Dynamic programming

2016-01-02 12:24 796 查看


DP


(DP(动态规划Dynamic programming))

动态规划(dynamic programming)背后的思想非常简单:通常为了解决一个问题,我们需要把它分解成很多类似的但更小的子问题,然后解决这些子问题,最终把这些子问题结果联系起来就解决了原先的那个问题。但是在上面这个过程中,如果使用的是比较“原始”的方法,它会碰到多次产生相同的子问题(比如子问题的子问题重复),多次重复解决这些其实已经被解决过一遍的子问题,从而造成计算机性能和时间上的浪费,动态规划(DP)就是一种保证让每个子问题只被解决一次,而不被重复解决的方法,减少重复计算——它把每次计算子问题的结果都保存起来,下次要计算这个子问题时就先查看这个子问题是否已经被保存(已经被解决过一遍),是则直接返回这个被保存的结果,否则解决这个子问题,然后保存和返回结果。

DP(动态规划)的特点是重复子问题(子问题会经常出现大量重复)和最优解结构(每个子问题的解都保证最优)。由于“分治”算法 和快速排序算法 都 没有重复子问题特点所以不属于动态规划;由于"贪心"算法无法保证最优解结构特点,故也不是动态规划。

有2种实现动态规划的方法:

(1)Top-down:在递归中使用一个table记录每个子问题的解决结果,每次开始时先查询table,若已经有这个子问题的记录则直接返回这个结果。

(2)Bottom-up:我们其实可以在方法(1)Top-down的基础上更进一步精炼,不从大问题到小问题递归然后从小问题递归返回大问题,而是直接先解决所有最小的A类问题,利用这些结果解决所有比最小的A类问题大一级的B类问题,利用这些结果解决所有比B类问题大一级的C类问题......依次类推直到解决我们当前碰到的大问题。

第(2)中方法可以使用Bellman equation(在控制理论中经常用到的方程式)来提炼。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: