转自:算法
动态规划的基本思想blog
动态规划的基本思想在于发现和定义问题中的子问题,这里子问题可也以叫作状态;以及一个子问题到下一个子问题之间 是如何转化的 也就是状态转移方程递归
所以咱们遇到一个问题的时候 应该想想这个问题是否能用某种方式表示成一个小问题,而且小问题具备最优子结构it
最优子结构:问题的最优解由相关子问题的最优解组合而成,这些子问题能够独立求解im
关于最优子结构 咱们来看2个示例img
一、求无权有向图中q-t的最短路径动态规划
若是q-t间的最短路径通过了点w 那么咱们能够证实 q-w w-t也均是最短路径 co
因此无权有向图最短路径是具备最优子结构的ps
二、求无权有向图中q-t的最长的路径ab
而无权有向图最长路径中
q-t的最长路径是是q-r-t 但 q-r缺不是q-r的最长路径 q-s-t-r是一条更长的路径
因此无权有向图最长路径不具备最优子结构
动态规划与贪心等其余算法的比较
动态规划与分治,减治
分治 :将大问题分红若干个小问题去解决 递归的求解每一个小问题,每一个小问题之间没有关系 例如 快排
减治 :将大问题缩减成小问题,减掉的部分不须要考虑,例如:二分查找
动态规划:将原问题分红多个子问题,不一样子问题间存在必定的联系,相互间有重叠的子问题
这里我我的认为动态规划分治 减治都是将大问题拆分红小问题 进行求解 区别在于
减治法减掉的部分 能够不用再求解了;
分治法每一个小问题都须要进行求解;
动态规划不一样的子问题间是有相互重叠的子问题的
动态规划与贪心
动态规划在于咱们求解了全部子问题 虽然有些子问题最终并不能组成答案
而贪心算法任务无需求解全部子问题,因此选择在当前状况下最优的状况自顶向下的求解问题,贪心能够认为是动态规划的一个特例
若是用一个树来表示子问题的话 能够认为动态规划考虑了树中的全部节点
而贪心算法减去了树了许多枝干,在考虑了通向最优解的那一条路