什么是动态规划
- 动态规划(Dynamic Programming),简称DP。如果某一问题有很多重叠子问题,使用动态规划是最有效的。动态规划最核心的思想,就在于拆分子问题,记住过往,减少重复计算。
动态规划的解题步骤
对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!
- 确定状态标识,即确定dp数组以及下标的含义
- 确定状态转移方程
- 初始化dp数组,保证填表时不越界(递推公式决定了dp数组要如何初始化)
- 确定遍历顺序
- 根据题目要求和状态表示确定返回值
动态规划应该如何debug
找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的!
做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。
这样才是一个完整的思考过程,而不是一旦代码出问题,就毫无头绪的东改改西改改,最后过不了,或者说是稀里糊涂的过了。
题目列表
斐波那契数列模型
路径问题
多状态dp问题
股票问题
- 121. 买卖股票的最佳时机
- 122. 买卖股票的最佳时机 II
- 123. 买卖股票的最佳时机 III
- 188. 买卖股票的最佳时机 IV
- 309. 买卖股票的最佳时机含冷冻期
- 714. 买卖股票的最佳时机含手续费
子数组/子串问题
- 53. 最大子数组和
- 918. 环形子数组的最大和
- 152. 乘积最大子数组
- 1567. 乘积为正数的最长子数组长度
- 413. 等差数列划分
- 978. 最长湍流子数组
- 139. 单词拆分
- 467. 环绕字符串中唯一的子字符串
子序列问题
- 300. 最长递增子序列
- 674. 最长连续递增序列
- 376. 摆动序列
- 673. 最长递增子序列的个数
- 646. 最长数对链
- 1218. 最长定差子序列
- 873. 最长的斐波那契子序列的长度
- 1027. 最长等差数列
- 446. 等差数列划分 II - 子序列
回文串问题
两个数组/序列的dp
- 1143. 最长公共子序列
- 1035. 不相交的线 - 力扣(LeetCode)
- 115. 不同的子序列
- 44. 通配符匹配
- 10. 正则表达式匹配
- 97. 交错字符串
- 712. 两个字符串的最小ASCII删除和
- 718. 最长重复子数组
- 583. 两个字符串的删除操作
- 72. 编辑距离
- 392. 判断子序列