动态规划总结
Table of Contents
动态规划五部曲
五部曲
-
确定dp数组
-
确定递推公式
-
初始化
-
遍历顺序
-
举例推导
动态规划系列基础问题
- 关于动态规划,你该了解这些!
理解动态规划五部曲,利用打印dp数组进行debug。理解是用动态规划问题的一些特点。比如总最优问题能拆出多个最优子问题,各个父子问题之间有递推关系,伴随着状态的转移。
-
理解动态规划五部曲,利用打印dp数组进行debug。理解是用动态规划问题的一些特点。比如总最优问题能拆出多个最优子问题,各个父子问题之间有递推关系,伴随着状态的转移。
-
动态规划:斐波那契数
非常自然的能理解父子问题的存在以及之间的递推关系。
-
非常自然的能理解父子问题的存在以及之间的递推关系。
-
动态规划:爬楼梯
每次选择爬一步还是两步意味着两种状态,动态规划优化了这个一步步决策的过程,前一爬和后一爬之间有着状态的转移。
-
每次选择爬一步还是两步意味着两种状态,动态规划优化了这个一步步决策的过程,前一爬和后一爬之间有着状态的转移。
-
动态规划:使用最小花费爬楼梯
逻辑和上面相同,在选择的时候考虑爬一步花费最少还是爬两步花费最少
-
逻辑和上面相同,在选择的时候考虑爬一步花费最少还是爬两步花费最少
-
动态规划:不同路径
考虑到达当前位置能有几种选择。
-
考虑到达当前位置能有几种选择。
-
动态规划:不同路径还不够,要有障碍!
障碍物位置的状态为 0
-
障碍物位置的状态为 0
-
动态规划:整数拆分,你要怎么拆?
拆分成2个数以及可以继续拆分的数,两种情况。
-
拆分成2个数以及可以继续拆分的数,两种情况。
-
动态规划:不同的二叉搜索树
先确定根节点,根据根节点进行分类讨论状态
- 先确定根节点,根据根节点进行分类讨论状态
背包问题系列
- 动态规划:关于01背包问题,你该了解这些!
理解01背包由暴力回溯转化而来。背包容量、物品、重量、价值几个概念
-
理解01背包由暴力回溯转化而来。背包容量、物品、重量、价值几个概念
-
动态规划:关于01背包问题,你该了解这些!(滚动数组)
背包应当逆序防止被覆盖
-
背包应当逆序防止被覆盖
-
动态规划:分割等和子集可以用01背包!
能否把容量为 sum / 2的背包装满。
-
能否把容量为 sum / 2的背包装满。
-
动态规划:最后一块石头的重量 II
石头堆总和的1/2容量的背包的最大重量和剩余重量差值
-
石头堆总和的1/2容量的背包的最大重量和剩余重量差值
-
动态规划:目标和!
用数组中的数凑数目标target,求组合数
-
用数组中的数凑数目标target,求组合数
-
动态规划:一和零!
背包的容量增加了一个维度,求最大价值
-
背包的容量增加了一个维度,求最大价值
-
动态规划:关于完全背包,你该了解这些!
每类物品的数量无限,状态转移时讨论有差异
-
每类物品的数量无限,状态转移时讨论有差异
-
动态规划:给你一些零钱,你要怎么凑?
只有三类物品,物品数量无限,凑出总金额,求组合数
-
只有三类物品,物品数量无限,凑出总金额,求组合数
-
动态规划:Carl称它为排列总和!
看似求组合实际求排列,完全背包中外层背包内层物品求排列,外层物品内层背包求组合
-
看似求组合实际求排列,完全背包中外层背包内层物品求排列,外层物品内层背包求组合
-
动态规划:以前我没得选,现在我选择再爬一次!
每次爬的楼层数不固定,求的是排列数
-
每次爬的楼层数不固定,求的是排列数
-
动态规划: 给我个机会,我再兑换一次零钱
不求组合数,求所需最少硬币个数
-
不求组合数,求所需最少硬币个数
-
动态规划:一样的套路,再求一次完全平方数
使用完全平方和凑整数,求所需最少数量,和零钱兑换一模一样。注意遍历i,但使用i*i凑和
-
使用完全平方和凑整数,求所需最少数量,和零钱兑换一模一样。注意遍历i,但使用i*i凑和
-
动态规划:单词拆分
用字符串列表填满单词,问能否刚好装满背包
-
用字符串列表填满单词,问能否刚好装满背包
-
动态规划:关于多重背包,你该了解这些!、
面试频率低
-
面试频率低
-
听说背包问题很难? 这篇总结篇来拯救你了
打家劫舍系列
- 动态规划:开始打家劫舍!
每家偷还是不偷?状态转移时选择最优解
-
每家偷还是不偷?状态转移时选择最优解
-
动态规划:继续打家劫舍!
房屋成环,则不要同时考虑首尾两家
-
房屋成环,则不要同时考虑首尾两家
-
动态规划:还要打家劫舍!
树形dp掌握树的遍历方式,因为要记录金额所以要后序遍历。将空节点状态推断为0,统一递推公式
- 树形dp掌握树的遍历方式,因为要记录金额所以要后序遍历。将空节点状态推断为0,统一递推公式
股票系列
- 动态规划:买卖股票的最佳时机
买卖一次,每天是持有状态或者不持有状态
-
买卖一次,每天是持有状态或者不持有状态
-
动态规划:买卖股票的最佳时机II
买卖多次
-
买卖多次
-
动态规划:买卖股票的最佳时机III
限定交易次数为2次,按照交易阶段划分状态
-
限定交易次数为2次,按照交易阶段划分状态
-
动态规划:买卖股票的最佳时机IV
限定交易次数为k次,仍按照交易阶段划分状态,不过发现奇数天和偶数天规律
-
限定交易次数为k次,仍按照交易阶段划分状态,不过发现奇数天和偶数天规律
-
动态规划:最佳买卖股票时机含冷冻期
有了冷冻期,状态划分更加详细
-
有了冷冻期,状态划分更加详细
-
动态规划:买卖股票的最佳时机含手续费
无限次买卖,只需要再收获利润的时候减去手续费
-
无限次买卖,只需要再收获利润的时候减去手续费
-
动态规划:股票系列总结篇
子序列系列
- 动态规划:最长递增子序列
递增子序列长度增加要找到前一个递增子序列
-
递增子序列长度增加要找到前一个递增子序列
-
动态规划:最长连续递增序列
前一个递增子序列只能是以 nums[i-1] 结尾
-
前一个递增子序列只能是以 nums[i-1] 结尾
-
动态规划:最长重复子数组
重复子数组增加需要增加两个相同的元素。
-
重复子数组增加需要增加两个相同的元素。
-
动态规划:最长公共子序列
公共子序列增加也是需要增加 两个相同元素,但是中间可能插入其余元素
-
公共子序列增加也是需要增加 两个相同元素,但是中间可能插入其余元素
-
动态规划:不相交的线
与最长公共子序列相同
-
与最长公共子序列相同
-
动态规划:最大子序和
连续子数组和的增加必须在后面增加一个元素
-
连续子数组和的增加必须在后面增加一个元素
-
动态规划:判断子序列
-
动态规划:不同的子序列
-
动态规划:两个字符串的删除操作
-
动态规划:编辑距离
-
动态规划:回文子串
-
动态规划:最长回文子序列