跳至主要內容

动态规划

Mike大约 5 分钟leetcodedynamic programming

动态规划

动态规划概述

动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。

在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分解成若干个互相联系的阶段,在它的每一个阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。这种把一个问题看做是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策最优化问题

动态规划算法的基本思想

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解中得到原问题的解。与分治法不同的是,适用于动态规划求解的问题,经分解后得到的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。

动态规划算法的基本模型

  1. 确定问题的决策对象
  2. 对决策过程划分阶段
  3. 对各阶段确定状态变量
  4. 根据状态变量确定费用函数和目标函数
  5. 建立各阶段状态变量的转移过程,确定状态转移方程

动态规划算法的适用条件

  1. 最优化原理(最优子结构性质):整个问题的最优解可以通过求解子问题得到(通过子问题的最优解构造出全局最优解)。
  2. 无后效性:将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。
  3. 子问题的重叠性:如果有大量的重叠子问题,可以用空间将这些子问题的解存储下来,避免重复求解相同的子问题,从而提升效率。

习题

基础题目

509: 斐波那契数
70: 爬楼梯
1137: 第N个泰波那契数
746: 使用最小花费爬楼梯
740: 删除并获得点数
198: 打家劫舍
343: 整数拆分

矩阵

62: 不同路径
64: 最小路径和
63: 不同路径II
120: 三角形最小路径和
931: 下降路径最小和
221: 最大正方形

背包问题

416: 分割等和子集
1049: 最后一块石头的重量II
494: 目标和
474: 一和零

完全背包

518: 零钱兑换II
322: 零钱兑换
279: 完全平方数
377: 组合总和IV
139: 单词拆分

动态规划在树的应用

213: 打家劫舍II
337: 打家劫舍III
96: 不同的二叉搜索树
95: 不同的二叉搜索树II
124: 二叉树中的最大路径和

买卖股票的最佳时间/状态机

121: 买卖股票的最佳时机
123: 买卖股票的最佳时机III
188: 买卖股票的最佳时机IV
309: 最佳买卖股票时机含冷冻期

子序列(不连续)

1143: 最长公共子序列
1035: 不相交的线
300: 最长递增子序列
673: 最长递增子序列的个数
1312: 让字符串成为回文串的最少插入次数
646: 最长数对链
1218: 最长定差子序列
1027: 最长等差数列
354: 俄罗斯套娃信封问题
1964: 找出到每个位置为止最长的有效障碍赛跑路线

子序列(连续)

674: 最长连续递增序列
718: 最长重复子数组

编辑距离

392: 判断子序列
115: 不同的子序列
583: 两个字符串的删除操作
712: 两个字符串的最小ASCII删除和
72: 编辑距离

回文

5: 最长回文子串
647: 回文子串
516: 最长回文子序列

动态规划:一维

2140: 解决智力问题
2466: 统计构造好字符串的方案数
91: 解码方法
983: 最低票价
790: 多米诺和托米诺平铺

总结