动态规划题目千变万化,很多人刚入门时候都觉得非常难以理解,题目越做越挫,越做打击越大,看着别人的题解,心里只能默念一句卧槽,这都能写出状态方程!
走了那么多弯路,才发现问题所在,主要原因是因为基础的东西没掌握好,力扣上很多题目都是从这些基础的套路演变出来的,把基础问题的状态方程掌握和理解好,自己自然也就能写出其他题目的状态方程了。
所谓一生二,二生三,三生万物,把这一、二彻底弄懂了,其他花里胡哨的也自然就迎刃而解了。
如果能按照下面的专题刷,先读懂例题,再把本文给出的leetcode的题目刷一遍,都是一样的框架(套路),保证您对动态规划的理解上一个新的台阶。
动态规划是运筹学里的一个分支, 常常用一个数来表示一个集合, 如数字三角形模型第一个题, dp[i][j]表示为所有从点(0,0)走到点(i,j)的所有合法路径, 由于答案只要最小值, 所以dp[i][j]只保存最小值, 理解好这一点,至关重要。
一、数字三角形模型
例题:给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。
解题思路:假设矩阵m的大小为M*N,行数为M,列数为N。生成大小和m一样的矩阵dp,行数为M,列数为N。
dp[i][j]的值表示从左上角,也就是(0,0)位置,走的(i,j)位置的最小路径和。
base case:如下图所示,第一行只能有向右走,第一列只能向下走,所以分别就是行的和and列的和。
leetcode题目:
64 最小路径和(本题)
120 三角形最小路径和
931 下降路径最小和
1289 下降路径最小和 II
二、最长上升子序列模型(线性Dp)
leetcode题目:
276. 栅栏涂色
题解: https://leetcode-cn.com/problems/paint-fence/solution/java-dong-tai-gui-hua-by-william-43/
300. 最长上升子序列
368. 最大整除子集
640.最长数对链
673. 最长递增子序列的个数
三、字符串
leetcode 题目:
72 编辑距离
132. 分割回文串 II
410. 分割数组的最大值
583 两个字符串的删除操作
712 两个字符串的最小ASCII删除和
940. 不同的子序列 II
1035. 不相交的线
1143. 最长公共子序列
四、01背包问题
例题: 一个背包有一定的承重W,有N件物品,每件都有自己的价值,记录在数组v中,也都有自己的重量,记录在数组w中,每件物品只能选择要装入背包还是不装入背包,要求在不超过背包承重的前提下,选出物品的总价值最大。
解题思路:按照物品序号i进行遍历,要么拿这件物品,要么不这件物品
定义dp[i][j]
i:为物品序号, j:为当前承受的重量
dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + values[i])
dp[i-1][j]: 不拿当前i序号物品
dp[i-1][j-w[i]] + values[i]: 拿当前物品,其中比较难理解的是dp[i-1][j-w[i]]
dp[i-1][j-w[i]] : 因为该条件下是拿了当前物品,且当前为dp[i][j],当前承重为j,且当前物品重量为w[i],所以上一个的承重为j-w[i]
注意后续只有当j+w[i]小于最大承重W才能拿当前物品。
对于dp矩阵来说,行数是物品的数量n,列数是背包的重量w。从左到右,再从上到下依次计算所有的dp值即可。
leetcode题目
416. 分割等和子集
983. 最低票价
五、状态机模型
六、状态压缩DP
464. 我能赢吗(技巧满分)
七、区间DP
471. 编码最短长度的字符串 - 区间DP
486. 预测赢家
546. 移除盒子(困难)
题解:https://leetcode-cn.com/problems/remove-boxes/solution/fei-di-gui-ban-qu-jian-dp-by-acw_weian/
1216. 验证回文串III (中等)
题解: https://leetcode-cn.com/problems/valid-palindrome-iii/solution/qu-jian-dp-java-by-acw_weian/
647. 回文子串
1547. 切棍子的最小成本
5498. 石子游戏 V
https://leetcode-cn.com/problems/stone-game-v/
八、树形DP
九、数位统计DP
十、记忆化搜索
十一、概率DP
514. 自由之路
1230. 抛掷硬币
十二、找规律
这类题目往往需要从题意里发现规律
375. 猜数字大小 II
467. 环绕字符串中唯一的子字符串
546. 移除盒子(困难),也是区间Dp
题解:https://leetcode-cn.com/problems/remove-boxes/solution/fei-di-gui-ban-qu-jian-dp-by-acw_weian/
887. 鸡蛋掉落
题解:https://leetcode-cn.com/problems/super-egg-drop/solution/887-ji-dan-diao-luo-dong-tai-gui-hua-er-fen-shi-ji/
1240. 铺瓷砖