动态规划和分治法类似,也是将问题分解为一些列的子问题,通过寻找子问题的最优解来得到问题的解。
区别在于:
1,分治法的子问题相互独立,相同的子问题被重复计算,而动态规划方法解决了这一问题。(重复子问题的计算导致很多用递归实现的分治法方案的时间复杂度按指数增长,而引入动态规划方法或者备忘录方法,复杂度降低到多项式时间)
2,分治法是按自上而下的的方法,通过递归将原问题逐步分解为子问题;
动态规划法是自底向上的,从子问题入手,逐步扩展至原问题。
动态规划求解问题的两个要素:最优子结构特性和重叠子问题,用这俩要素判定一个实际问题是否适合用动态规划方法求解。
动态规划的实例比较多,我打算这几天都动手实现一下,参考书目《算法设计与分析》:
1,多段图问题
2,资源分配问题
3,关键路径问题
4,最短路径问题(Floyd算法)
5,矩阵两乘问题
6,最长公共子序列问题
7,0/1背包问题
8,流水线作业问题
9,最优二叉搜索树