动态规划总结
- 什么是动态规划
- 动态规划算法步骤
- 大量练习
总结
动态规划的四个步骤:
- 定义状态数组
- 初始化状态是数组
- 状态转移
- 返回最终需要的状态值
问题--->穷举---->抽象出树形结构---> DFS/回溯---->记忆化搜索---> 状态定义/状态转移
状态转移:
- 自底而上演示
- 填表法
动态规划的三个特征
- 存在重复子问题
- 无后效性(后面的选择不会影响前面的选择)
- 最优子结构
无后效性:一个状态的状态值一旦被确定,那么这个状态值不受后面的状态的影响。
最优子结构:
每个状态的状态值都是最优的,后面的状态的状态值可以由前面的一个状态 或者多个状态的状态值推导出来。
动态规划求解的问题
动态规划求解的问题 最优值
动态规划可以解决的问题
-
求"最"优解问题(最大值和最小值)
-
152 乘积最大子数组
-
409 最长回文串
-
300 最长递增子序列
-
-
求可行性(TRUE或者FALSE)
-
零钱兑换(322)
-
交错字符串(97)
-
-
求方案总数
-
零钱兑换②(518)
-
不同路径(62)
-
动态规划分类
- 线性DP问题
- 区间DP问题
- 背包系列DP问题
- 状态压缩DP问题(偏竞赛)
- 数位DP问题(偏竞赛)
线性DP问题
单数组/单字符串
特点:dp[i]依赖于前面一个或者两个状态计算得到
-
打家劫舍 198
-
最大子数组和 53
-
解码方法 91
-
乘积最大子数组 152
-
摆动序列 376
-
打家劫舍②
-
斐波那契数列
-
爬楼梯问题
-
使用最小花费爬楼梯
依赖前面多个状态得到
-
300最长递增子序列
LIS
dp[i]
表示数组区间[0...i]的【最长递增子序列的长度】注意:必须以
nums[i]
结尾,也就是说必须选择nums[i]
-
354俄罗斯套娃问题
-
32最长有效括号
-
139单词拆分
带有一个或者多个维度
股票系列问题
- 121
- 122
- 123
- 188
- 309
- 714
双数组/双字符串
-
经典LCS问题
-
1143 最长公共子序列
-
718最长重复子数组
-
-
字符串匹配问题
- 10正则表达式匹配问题
- 44通配符匹配
- 72编辑距离
-
其他
- 97 交错字符串
- 115 不同的子序列
输入为矩阵
- 64 最小路径和
- 62不同路径
- 63不同路径②
- 120三角形最小路径和
- 97交错字符串
区间DP问题
dp[i][j]
表示数组/字符串区间[i,j]对应的子数组/字串的状态值。
dp[i][j]
一般可以由dp[i+1][j]
,dp[i][j-1]
、dp[i-1][j-1]
推导而来的。
回文问题
- 5最长回文字串
- 131分割回文串
- 516最长回文子序列
- 647回文字串
其他
- 486预测赢家
背包系列问题
一、0-1背包问题
- 416分割等和子集
- 494目标和
二、完全/多重背包问题
- 139单词拆分
- 279完全平方数
- 322零钱兑换
- 518零钱兑换②
- 377组合总和
三、二维费用背包
- 474 一和零
作业
-
740 删除并获得节点数 打家劫舍模型
-
413 等差数列划分
-
918环形子数组的最大和
-
673最长递增子序列的个数
-
368最大整除子集
-
256粉刷房子
-
410分割数组的最大值
-
813最大平均值和的分组
-
1207最长等差数列
-
1230抛掷硬币
-
583两个字符串的删除问题
-
712两个字符串的最小ASCII 删除和
-
931下降路径最小和
-
221最大正方形
-
132分割回文串
-
1312让字符串成为回文串的最少插入次数
-
312戳气球
-
1049最后一块石头的重量②