什么是动态规划
- 动态规划(Dynamic Programming),简称DP。如果某一问题有很多重叠子问题,使用动态规划是最有效的。动态规划最核心的思想,就在于拆分子问题,记住过往,减少重复计算。
动态规划的解题步骤
对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!
- 确定状态标识,即确定dp数组以及下标的含义
- 确定状态转移方程
- 初始化dp数组,保证填表时不越界(递推公式决定了dp数组要如何初始化)
- 确定遍历顺序
- 根据题目要求和状态表示确定返回值
动态规划应该如何debug
找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的!
做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。
这样才是一个完整的思考过程,而不是一旦代码出问题,就毫无头绪的东改改西改改,最后过不了,或者说是稀里糊涂的过了。
题目列表
斐波那契数列模型
- 509. 斐波那契数
- 1137. 第 N 个泰波那契数
- 70. 爬楼梯 - 力扣(LeetCode)
- 面试题 08.01. 三步问题
- 746. 使用最小花费爬楼梯
路径问题
- 62. 不同路径
- 63. 不同路径 II
- 剑指 Offer 47. 礼物的最大价值 - 力扣(LeetCode)
- 931. 下降路径最小和
- 64. 最小路径和
- 174. 地下城游戏
多状态dp问题
-
198. 打家劫舍
-
213. 打家劫舍 II
-
面试题 17.16. 按摩师
-
740. 删除并获得点数
-
LCR 091. 粉刷房子
股票问题
- 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 - 子序列
回文串问题
- 647. 回文子串
- 5. 最长回文子串
- 1745. 分割回文串 IV
- 132. 分割回文串 II
- 516. 最长回文子序列
- 1312. 让字符串成为回文串的最少插入次数
两个数组/序列的dp
- 1143. 最长公共子序列
- 1035. 不相交的线 - 力扣(LeetCode)
- 115. 不同的子序列
- 44. 通配符匹配
- 10. 正则表达式匹配
- 97. 交错字符串
- 712. 两个字符串的最小ASCII删除和
- 718. 最长重复子数组
- 583. 两个字符串的删除操作
- 72. 编辑距离
- 392. 判断子序列
01背包问题
- 【模板】01背包 (nowcoder.com)
- 416. 分割等和子集
- 494. 目标和
- 1049. 最后一块石头的重量 II
完全背包问题
- 【模板】完全背包(nowcoder.com)
- 322. 零钱兑换
- 518. 零钱兑换 II
- 279. 完全平方数
二维费背包问题
- 474. 一和零 - 力扣(LeetCode)
- 879. 盈利计划
其他动规问题
-
377. 组合总和 Ⅳ
-
96. 不同的二叉搜索树
-
91. 解码方法
-
337. 打家劫舍 III