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(在控制理论中经常用到的方程式)来提炼。
相关文章推荐
- ifcfg, ip,ss及配置文件
- Linguistic Data Consortium (LDC)
- 【线性代数】 07 - 线性函数
- Thread和Service应用场合的区别
- tomcat学习
- 枚举enum用法总结
- 【转】Codeforces GoodBye2015 New Year and Three Musketeers Codeforces 611E(贪心)
- 2、创建File类对象
- python之获取微信服务器的ip地址
- <LeetCode OJ>Binary Tree Preorder Traversal【144】
- 网站性能优化前端+服务器+数据库
- Left/Right/Inner Join用法和区别
- 前台模糊查询中用“\%”替换字符串中的“%”
- Spring学习笔记 1. 尚硅谷_佟刚_Spring_HelloWorld
- 无法注册账户
- 十分钟搞定pandas
- Android如何防止apk程序被反编译
- javascript对select值的简单控制
- 初识CSS--常用元素总结(三)-盒模型
- 你可能不知道的10个JavaScript小技巧(真的不是用来装x的)