跳至主要內容

3.6 动态规划


3.6 动态规划

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

动态规划三要素:

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

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

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

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

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

动态规划的解题方法:

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

动态规划的解题步骤:

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

相关题目

动态规划基础题目

题号标题题解标签难度
0509斐波那契数open in new windowJSopen in new window递归 记忆化搜索 数学 1+
0070爬楼梯open in new windowJSopen in new window记忆化搜索 数学 动态规划
0062不同路径open in new windowJSopen in new window数学 动态规划 组合数学

记忆化搜索

题号标题题解标签难度
1137第 N 个泰波那契数open in new windowJSopen in new window记忆化搜索 数学 动态规划
0375猜数字大小 IIopen in new windowJSopen in new window数学 动态规划 博弈
0494目标和open in new windowJSopen in new window数组 动态规划 回溯
0576出界的路径数open in new window动态规划
0087扰乱字符串open in new window字符串 动态规划
0403青蛙过河open in new window数组 动态规划
0552学生出勤记录 IIopen in new window动态规划
0913猫和老鼠open in new window 拓扑排序 记忆化搜索 3+
0329矩阵中的最长递增路径open in new window深度优先搜索 广度优先搜索 5+

线性 DP

  • 单串线性 DP 问题
题号标题题解标签难度
0300最长递增子序列open in new windowJSopen in new window数组 二分查找 动态规划
0673最长递增子序列的个数open in new window树状数组 线段树 数组 1+
0354俄罗斯套娃信封问题open in new windowJSopen in new window数组 二分查找 动态规划 1+
0053最大子数组和open in new windowJSopen in new window数组 分治 动态规划
0152乘积最大子数组open in new windowJSopen in new window数组 动态规划
0918环形子数组的最大和open in new window队列 数组 分治 2+
0198打家劫舍open in new windowJSopen in new window数组 动态规划
0213打家劫舍 IIopen in new window数组 动态规划
0740删除并获得点数open in new window数组 哈希表 动态规划
13883n 块披萨open in new window贪心 数组 动态规划 1+
0873最长的斐波那契子序列的长度open in new window数组 哈希表 动态规划
1027最长等差数列open in new window数组 哈希表 二分查找 1+
1055形成字符串的最短路径open in new window贪心 双指针 字符串
0368最大整除子集open in new window数组 数学 动态规划 1+
0032最长有效括号open in new window 字符串 动态规划
0413等差数列划分open in new window数组 动态规划
0091解码方法open in new window字符串 动态规划
0639解码方法 IIopen in new window字符串 动态规划
0132分割回文串 IIopen in new window字符串 动态规划
1220统计元音字母序列的数目open in new window动态规划
0338比特位计数open in new window位运算 动态规划
0801使序列递增的最小交换次数open in new window数组 动态规划
0871最低加油次数open in new window贪心 数组 动态规划 1+
0045跳跃游戏 IIopen in new window贪心 数组 动态规划
0813最大平均值和的分组open in new window数组 动态规划 前缀和
0887鸡蛋掉落open in new window数学 二分查找 动态规划
0256粉刷房子open in new window数组 动态规划
0265粉刷房子 IIopen in new window数组 动态规划
1473粉刷房子 IIIopen in new window数组 动态规划
0975奇偶跳open in new window 数组 动态规划 2+
0403青蛙过河open in new window数组 动态规划
1478安排邮筒open in new window数组 数学 动态规划 1+
1230抛掷硬币open in new window数学 动态规划 概率与统计
0410分割数组的最大值open in new window贪心 数组 二分查找 2+
1751最多可以参加的会议数目 IIopen in new window数组 二分查找 动态规划 1+
1787使所有区间的异或结果为零open in new window位运算 数组 动态规划
0121买卖股票的最佳时机open in new windowJSopen in new window数组 动态规划
0122买卖股票的最佳时机 IIopen in new windowJSopen in new window贪心 数组
0123买卖股票的最佳时机 IIIopen in new windowJSopen in new window数组 动态规划
0188买卖股票的最佳时机 IVopen in new windowJSopen in new window数组 动态规划
0309最佳买卖股票时机含冷冻期open in new windowJSopen in new window数组 动态规划
0714买卖股票的最佳时机含手续费open in new windowJSopen in new window贪心 数组
  • 双串线性 DP 问题
题号标题题解标签难度
1143最长公共子序列open in new windowJSopen in new window字符串 动态规划
0712两个字符串的最小ASCII删除和open in new windowJSopen in new window字符串 动态规划
0718最长重复子数组open in new window数组 二分查找 动态规划 3+
0583两个字符串的删除操作open in new windowJSopen in new window字符串 动态规划
0072编辑距离open in new windowJSopen in new window字符串 动态规划
0044通配符匹配open in new windowJSopen in new window贪心 递归 字符串 1+
0010正则表达式匹配open in new windowJSopen in new window递归 字符串 动态规划
0097交错字符串open in new window字符串 动态规划
0115不同的子序列open in new window字符串 动态规划
0087扰乱字符串open in new window字符串 动态规划
  • 矩阵线性 DP 问题
题号标题题解标签难度
0118杨辉三角open in new window数组 动态规划
0119杨辉三角 IIopen in new window数组 动态规划
0120三角形最小路径和open in new windowJSopen in new window数组 动态规划
0064最小路径和open in new windowJSopen in new window数组 动态规划 矩阵
0174地下城游戏open in new windowJSopen in new window数组 动态规划 矩阵
0221最大正方形open in new windowJSopen in new window数组 动态规划 矩阵
0931下降路径最小和open in new windowJSopen in new window数组 动态规划 矩阵
0576出界的路径数open in new window动态规划
0085最大矩形open in new window 数组 动态规划 2+
0363矩形区域不超过 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 windowJSopen in new window记忆化搜索 数学 动态规划
0650只有两个键的键盘open in new window数学 动态规划
0264丑数 IIopen in new window哈希表 数学 动态规划 1+
0279完全平方数open in new windowJSopen in new window广度优先搜索 数学 动态规划
0343整数拆分open in new windowJSopen in new window数学 动态规划

背包问题

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

  • 分组背包问题

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

区间 DP

题号标题题解标签难度
0486预测赢家open in new window递归 数组 数学 2+
0312戳气球open in new window数组 动态规划
0877石子游戏open in new window数组 数学 动态规划 1+
1000合并石头的最低成本open in new window数组 动态规划 前缀和
1547切棍子的最小成本open in new window数组 动态规划 排序
0664奇怪的打印机open in new window字符串 动态规划
1039多边形三角剖分的最低得分open in new window数组 动态规划
0546移除盒子open in new window记忆化搜索 数组 动态规划
0375猜数字大小 IIopen in new windowJSopen in new window数学 动态规划 博弈
0678有效的括号字符串open in new windowJSopen in new window 贪心 字符串 1+
0005最长回文子串open in new windowJSopen in new window字符串 动态规划
0516最长回文子序列open in new windowJSopen in new window字符串 动态规划
0730统计不同回文子序列open in new window字符串 动态规划
2104子数组范围和open in new window 数组 单调栈

树形 DP

  • 固定根的树形 DP
题号标题题解标签难度
0543二叉树的直径open in new windowJSopen in new window 深度优先搜索 二叉树
0124二叉树中的最大路径和open in new window 深度优先搜索 动态规划 1+
1245树的直径open in new window 深度优先搜索 广度优先搜索 2+
2246相邻字符不同的最长路径open in new window 深度优先搜索 3+
0687最长同值路径open in new window 深度优先搜索 二叉树
0337打家劫舍 IIIopen in new window 深度优先搜索 动态规划 1+
0333最大 BST 子树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+
0968监控二叉树open in new window 深度优先搜索 动态规划 1+
1273删除树节点open in new window 深度优先搜索 广度优先搜索
1519子树中标签相同的节点数open in new window 深度优先搜索 广度优先搜索 2+
  • 不定根的树形 DP
题号标题题解标签难度
0310最小高度树open in new window深度优先搜索 广度优先搜索 1+
0834树中距离之和open in new window 深度优先搜索 1+
2581统计可能的树根数目open in new window 深度优先搜索 哈希表 1+

状态压缩 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+
0526优美的排列open in new window位运算 数组 动态规划 2+
0351安卓系统手势解锁open in new window动态规划 回溯
0464我能赢吗open in new window位运算 记忆化搜索 数学 3+
0847访问所有节点的最短路径open in new window位运算 广度优先搜索 2+
0638大礼包open in new window位运算 记忆化搜索 数组 3+
1994好子集的数目open in new window位运算 数组 数学 2+
1349参加考试的最大学生数open in new window位运算 数组 动态规划 2+
0698划分为k个相等的子集open in new window位运算 记忆化搜索 数组 3+
0943最短超级串open in new window位运算 数组 字符串 2+
0691贴纸拼词open in new window位运算 数组 字符串 3+
0982按位与为零的三元组open in new window位运算 数组 哈希表

计数 DP

题号标题题解标签难度
0062不同路径open in new windowJSopen in new window数学 动态规划 组合数学
0063不同路径 IIopen in new windowJSopen in new window数组 动态规划 矩阵
0343整数拆分open in new windowJSopen in new window数学 动态规划
0096不同的二叉搜索树open in new windowJSopen in new window 二叉搜索树 数学 2+
1259不相交的握手open in new window数学 动态规划
0790多米诺和托米诺平铺open in new window动态规划
0070爬楼梯open in new windowJSopen in new window记忆化搜索 数学 动态规划
0746使用最小花费爬楼梯open in new window数组 动态规划
0509斐波那契数open in new windowJSopen in new window递归 记忆化搜索 数学 1+
1137第 N 个泰波那契数open in new windowJSopen in new window记忆化搜索 数学 动态规划

数位 DP

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

概率 DP

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