跳至主要內容

3.6 动态规划


3.6 动态规划

动态规划(Dynamic Programming),简称 DP,将问题分解为互相重叠的子问题,通过反复求解子问题来解决原问题就是动态规划,如果某一问题有很多重叠子问题,使用动态规划来解是比较有效的。

动态规划三要素:

  • 重叠子问题
  • 最优子结构
  • 状态转移方程

求解动态规划的核心问题是穷举。

但是这类问题的特别之处在于,存在 「重叠子问题」,如果暴力穷举的话效率会极其低下。

动态规划问题一定会具备 「最优子结构」,才能通过子问题的最值得到原问题的最值。

另外问题千变万化,穷举所有可行解其实并不是一件容易的事,只有列出正确的 「状态转移方程」 才能正确地穷举。

动态规划的解题方法:

  • 递归+记忆化(自顶向下)
  • 动态规划(自底向上)

动态规划的解题步骤:

  • 根据重叠子问题定义状态
  • 寻找最优子结构,推导状态转移方程
  • 确定 dp 初始状态
  • 确定输出值

相关题目

动态规划基础题目

题号标题题解标签难度
509斐波那契数open in new window[✓]递归 记忆化搜索 数学 1+
70爬楼梯open in new window[✓]记忆化搜索 数学 动态规划
62不同路径open in new window[✓]数学 动态规划 组合数学

记忆化搜索

题号标题题解标签难度
1137第 N 个泰波那契数open in new window[✓]记忆化搜索 数学 动态规划
375猜数字大小 IIopen in new window[✓]数学 动态规划 博弈
494目标和open in new window[✓]数组 动态规划 回溯
576出界的路径数open in new window动态规划
87扰乱字符串open in new window字符串 动态规划
403青蛙过河open in new window数组 动态规划
552学生出勤记录 IIopen in new window动态规划
913猫和老鼠open in new window 拓扑排序 记忆化搜索 3+
329矩阵中的最长递增路径open in new window深度优先搜索 广度优先搜索 5+

线性 DP

  • 单串线性 DP 问题
题号标题题解标签难度
300最长递增子序列open in new window[✓]数组 二分查找 动态规划
673最长递增子序列的个数open in new window树状数组 线段树 数组 1+
354俄罗斯套娃信封问题open in new window[✓]数组 二分查找 动态规划 1+
53最大子数组和open in new window[✓]数组 分治 动态规划
152乘积最大子数组open in new window[✓]数组 动态规划
918环形子数组的最大和open in new window[✓]队列 数组 分治 2+
198打家劫舍open in new window[✓]数组 动态规划
213打家劫舍 IIopen in new window数组 动态规划
740删除并获得点数open in new window数组 哈希表 动态规划
13883n 块披萨open in new window贪心 数组 动态规划 1+
873最长的斐波那契子序列的长度open in new window数组 哈希表 动态规划
1027最长等差数列open in new window数组 哈希表 二分查找 1+
1055形成字符串的最短路径 🔒open in new window贪心 双指针 字符串 1+
368最大整除子集open in new window数组 数学 动态规划 1+
32最长有效括号open in new window[✓] 字符串 动态规划
413等差数列划分open in new window数组 动态规划 滑动窗口
91解码方法open in new window字符串 动态规划
639解码方法 IIopen in new window字符串 动态规划
132分割回文串 IIopen in new window字符串 动态规划
1220统计元音字母序列的数目open in new window动态规划
338比特位计数open in new window位运算 动态规划
801使序列递增的最小交换次数open in new window数组 动态规划
871最低加油次数open in new window贪心 数组 动态规划 1+
45跳跃游戏 IIopen in new window[✓]贪心 数组 动态规划
813最大平均值和的分组open in new window数组 动态规划 前缀和
887鸡蛋掉落open in new window数学 二分查找 动态规划
256粉刷房子 🔒open in new window数组 动态规划
265粉刷房子 II 🔒open in new window数组 动态规划
1473粉刷房子 IIIopen in new window数组 动态规划
975奇偶跳open in new window 数组 动态规划 2+
403青蛙过河open in new window数组 动态规划
1478安排邮筒open in new window数组 数学 动态规划 1+
1230抛掷硬币 🔒open in new window数组 数学 动态规划 1+
410分割数组的最大值open in new window贪心 数组 二分查找 2+
1751最多可以参加的会议数目 IIopen in new window数组 二分查找 动态规划 1+
1787使所有区间的异或结果为零open in new window位运算 数组 动态规划
121买卖股票的最佳时机open in new window[✓]数组 动态规划
122买卖股票的最佳时机 IIopen in new window[✓]贪心 数组 动态规划
123买卖股票的最佳时机 IIIopen in new window[✓]数组 动态规划
188买卖股票的最佳时机 IVopen in new window[✓]数组 动态规划
309买卖股票的最佳时机含冷冻期open in new window[✓]数组 动态规划
714买卖股票的最佳时机含手续费open in new window[✓]贪心 数组 动态规划
  • 双串线性 DP 问题
题号标题题解标签难度
1143最长公共子序列open in new window[✓]字符串 动态规划
712两个字符串的最小ASCII删除和open in new window[✓]字符串 动态规划
718最长重复子数组open in new window数组 二分查找 动态规划 3+
583两个字符串的删除操作open in new window[✓]字符串 动态规划
72编辑距离open in new window[✓]字符串 动态规划
44通配符匹配open in new window[✓]贪心 递归 字符串 1+
10正则表达式匹配open in new window[✓]递归 字符串 动态规划
97交错字符串open in new window[✓]字符串 动态规划
115不同的子序列open in new window字符串 动态规划
87扰乱字符串open in new window字符串 动态规划
  • 矩阵线性 DP 问题
题号标题题解标签难度
118杨辉三角open in new window[✓]数组 动态规划
119杨辉三角 IIopen in new window数组 动态规划
120三角形最小路径和open in new window[✓]数组 动态规划
64最小路径和open in new window[✓]数组 动态规划 矩阵
174地下城游戏open in new window[✓]数组 动态规划 矩阵
221最大正方形open in new window[✓]数组 动态规划 矩阵
931下降路径最小和open in new window[✓]数组 动态规划 矩阵
576出界的路径数open in new window动态规划
85最大矩形open in new window[✓] 数组 动态规划 2+
363矩形区域不超过 K 的最大数值和open in new window数组 二分查找 矩阵 2+
面试题 17.24最大子矩阵open in new window数组 动态规划 矩阵 1+
1444切披萨的方案数open in new window记忆化搜索 数组 动态规划 1+
  • 无串线性 DP 问题
题号标题题解标签难度
1137第 N 个泰波那契数open in new window[✓]记忆化搜索 数学 动态规划
650两个键的键盘open in new window数学 动态规划
264丑数 IIopen in new window[✓]哈希表 数学 动态规划 1+
279完全平方数open in new window[✓]广度优先搜索 数学 动态规划
343整数拆分open in new window[✓]数学 动态规划

背包问题

  • 0-1 背包问题
题号标题题解标签难度
416分割等和子集open in new window[✓]数组 动态规划
494目标和open in new window[✓]数组 动态规划 回溯
1049最后一块石头的重量 IIopen in new window[✓]数组 动态规划
  • 完全背包问题
题号标题题解标签难度
279完全平方数open in new window[✓]广度优先搜索 数学 动态规划
322零钱兑换open in new window[✓]广度优先搜索 数组 动态规划
518零钱兑换 IIopen in new window[✓]数组 动态规划
139单词拆分open in new window[✓]字典树 记忆化搜索 数组 3+
377组合总和 Ⅳopen in new window数组 动态规划
638大礼包open in new window位运算 记忆化搜索 数组 3+
1449数位成本和为目标值的最大数字open in new window数组 动态规划
  • 多重背包问题

  • 分组背包问题

题号标题题解标签难度
1155掷骰子等于目标和的方法数open in new window动态规划
2585获得分数的方法数open in new window数组 动态规划
  • 多维背包问题
题号标题题解标签难度
474一和零open in new window[✓]数组 字符串 动态规划
879盈利计划open in new window数组 动态规划
1995统计特殊四元组open in new window数组 哈希表 枚举

区间 DP

题号标题题解标签难度
486预测赢家open in new window递归 数组 数学 2+
312戳气球open in new window数组 动态规划
877石子游戏open in new window数组 数学 动态规划 1+
1000合并石头的最低成本open in new window数组 动态规划 前缀和
1547切棍子的最小成本open in new window数组 动态规划 排序
664奇怪的打印机open in new window字符串 动态规划
1039多边形三角剖分的最低得分open in new window数组 动态规划
546移除盒子open in new window记忆化搜索 数组 动态规划
375猜数字大小 IIopen in new window[✓]数学 动态规划 博弈
678有效的括号字符串open in new window[✓] 贪心 字符串 1+
5最长回文子串open in new window[✓]双指针 字符串 动态规划
516最长回文子序列open in new window[✓]字符串 动态规划
730统计不同回文子序列open in new window字符串 动态规划
2104子数组范围和open in new window 数组 单调栈

树形 DP

  • 固定根的树形 DP
题号标题题解标签难度
543二叉树的直径open in new window[✓] 深度优先搜索 二叉树
124二叉树中的最大路径和open in new window[✓] 深度优先搜索 动态规划 1+
1245树的直径 🔒open in new window 深度优先搜索 广度优先搜索 2+
2246相邻字符不同的最长路径open in new window 深度优先搜索 3+
687最长同值路径open in new window 深度优先搜索 二叉树
337打家劫舍 IIIopen in new window 深度优先搜索 动态规划 1+
333最大二叉搜索子树 🔒open in new window 深度优先搜索 二叉搜索树 2+
1617统计子树中城市之间最大距离open in new window位运算 动态规划 2+
2538最大价值和与最小价值和的差值open in new window 深度优先搜索 数组 1+
1569将子数组重新排序得到同一个二叉搜索树的方案数open in new window 并查集 二叉搜索树 7+
1372二叉树中的最长交错路径open in new window 深度优先搜索 动态规划 1+
1373二叉搜索子树的最大键值和open in new window 深度优先搜索 二叉搜索树 2+
968监控二叉树open in new window 深度优先搜索 动态规划 1+
1273删除树节点 🔒open in new window 深度优先搜索 广度优先搜索 1+
1519子树中标签相同的节点数open in new window 深度优先搜索 广度优先搜索 2+
  • 不定根的树形 DP
题号标题题解标签难度
310最小高度树open in new window深度优先搜索 广度优先搜索 1+
834树中距离之和open in new window 深度优先搜索 1+
2581统计可能的树根数目open in new window 深度优先搜索 数组 2+

状态压缩 DP

题号标题题解标签难度
1879两个数组最小的异或值之和open in new window位运算 数组 动态规划 1+
2172数组的最大与和open in new window位运算 数组 动态规划 1+
1947最大兼容性评分和open in new window位运算 数组 动态规划 2+
1595连通两组点的最小成本open in new window位运算 数组 动态规划 2+
1494并行课程 IIopen in new window位运算 动态规划 1+
1655分配重复整数open in new window位运算 数组 动态规划 2+
1986完成任务的最少工作时间段open in new window位运算 数组 动态规划 2+
1434每个人戴不同帽子的方案数open in new window位运算 数组 动态规划 1+
1799N 次操作后的最大分数和open in new window位运算 数组 数学 4+
1681最小不兼容性open in new window位运算 数组 动态规划 1+
526优美的排列open in new window位运算 数组 动态规划 2+
351安卓系统手势解锁 🔒open in new window位运算 动态规划 回溯 1+
464我能赢吗open in new window位运算 记忆化搜索 数学 3+
847访问所有节点的最短路径open in new window位运算 广度优先搜索 2+
638大礼包open in new window位运算 记忆化搜索 数组 3+
1994好子集的数目open in new window位运算 数组 数学 2+
1349参加考试的最大学生数open in new window位运算 数组 动态规划 2+
698划分为k个相等的子集open in new window位运算 记忆化搜索 数组 3+
943最短超级串open in new window位运算 数组 字符串 2+
691贴纸拼词open in new window位运算 数组 字符串 3+
982按位与为零的三元组open in new window位运算 数组 哈希表

计数 DP

题号标题题解标签难度
62不同路径open in new window[✓]数学 动态规划 组合数学
63不同路径 IIopen in new window[✓]数组 动态规划 矩阵
343整数拆分open in new window[✓]数学 动态规划
96不同的二叉搜索树open in new window[✓] 二叉搜索树 数学 2+
1259不相交的握手 🔒open in new window数学 动态规划
790多米诺和托米诺平铺open in new window动态规划
70爬楼梯open in new window[✓]记忆化搜索 数学 动态规划
746使用最小花费爬楼梯open in new window数组 动态规划
509斐波那契数open in new window[✓]递归 记忆化搜索 数学 1+
1137第 N 个泰波那契数open in new window[✓]记忆化搜索 数学 动态规划

数位 DP

题号标题题解标签难度
2376统计特殊整数open in new window数学 动态规划
357统计各位数字都不同的数字个数open in new window数学 动态规划 回溯
1012至少有 1 位重复的数字open in new window数学 动态规划
902最大为 N 的数字组合open in new window数组 数学 字符串 2+
788旋转数字open in new window数学 动态规划
600不含连续1的非负整数open in new window动态规划
233数字 1 的个数open in new window[✓]递归 数学 动态规划
2719统计整数数目open in new window数学 字符串 动态规划
248中心对称数 III 🔒open in new window递归 数组 字符串
1088易混淆数 II 🔒open in new window数学 回溯
1067范围内的数字计数 🔒open in new window数学 动态规划
1742盒子中小球的最大数量open in new window哈希表 数学 计数
面试题 17.062出现的次数open in new window递归 数学 动态规划

概率 DP

题号标题题解标签难度
688骑士在棋盘上的概率open in new window动态规划
808分汤open in new window数学 动态规划 概率与统计
837新 21 点open in new window数学 动态规划 滑动窗口 1+
1230抛掷硬币 🔒open in new window数组 数学 动态规划 1+
1467两个盒子中球的颜色数相同的概率open in new window数组 数学 动态规划 3+
1227飞机座位分配概率open in new window脑筋急转弯 数学 动态规划 1+
1377T 秒后青蛙的位置open in new window 深度优先搜索 广度优先搜索 1+
剑指 Offer 60n个骰子的点数open in new window[✓]数学 动态规划 概率与统计