动态规划——DP算法
动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。在背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题和复杂系统可靠性问题等中取得了显著的效果,用动态规划方法比用其它方法求解更为方便 。
虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解 。
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线.
动态规划遵从以下原理:
- 最优化原理(最优子结构性质)
一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。。这个原理常用于最短路径 - 无后效性(无后向性)
对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策。 - 子问题的重叠性
即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其他的算法。选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却无法承受,所以我们舍空间而取时间。另外当变量的维数增大时,总的计算量及存贮量急剧增大。因而,受计算机的存贮量及计算速度的限制,当今的计算机仍不能用动态规划方法来解决较大规模的问题,这就是**“维数障碍”**
动态规划算法没有统一的处理方法,必须根据问题的各种性质并结合一定的技巧来处理。通常使用循环嵌套、递归来实现。
刷题
5. 最大回文子串
72. 编辑距离
198. 打家劫舍
213. 打家劫舍 II
516. 最长回文子序列
674. 最长连续递增序列