algorithm-dp-game-theory
博弈dp
一人最大化得分,一人最小化得分
3283. 吃掉所有兵需要的最多移动次数
algorithm-dp-value-range
值域dp
利用值域作为状态进行dp,枚举值域
3277. 查询子数组最大异或值:https://bughere.github.io/algorithm/problem/algorithm-problem-leetcode-3277/
algorithm-dp-state-pressure
状压dp
状压矩阵行号:3276. 选择矩阵中单元格的最大得分
状压走过位置的集合:3283. 吃掉所有兵需要的最多移动次数
algorithm-dp-interval
区间dp
从数组的左右两端不断缩短,求解关于某段下标区间的最优值。
一般定义:f[i][j] 表示下标区间 [i, j] 的最优值。
最长回文子序列
516. 最长回文子序列
其它
5. 最长回文子串:记搜和递推两种写法
3040. 相同分数的最大操作数目 II(1709):有点意思
3277. 查询子数组最大异或值:区间dp嵌套区间dp
algorithm-dp-state-machine
状态机dp
一般定义 f[i][j] 表示在 nums[:i] 在状态 j 下的最优值。一般 j 都很小
代表题目是「买卖股票」系列
121. 买卖股票的最佳时机
122. 买卖股票的最佳时机 II
123. 买卖股票的最佳时机 III
188. 买卖股票的最佳时机 IV
309. 买卖股票的最佳时机含冷冻期
714. 买卖股票的最佳时机含手续费
algorithm-dp-linear
线性dp
经典线性dp
对于字符串s和t,一般定义f[i][j]表示对s[0:i]和t[0:j]的状态
最长公共子序列(LCS)
1143. 最长公共子序列
最长递增子序列(LIS)
300. 最长递增子序列
一维dp
发生在前缀/后缀之间的转移,例如从 f[i−1] 转移到 f[i],或者从 f[j] 转移到 f[i]
一维线性dp
2140. 解决智力问题(1709)
2944. 购买水果需要的最少金币数(1709)
2901. 最长相邻不相等子序列 II(1899): 还要输出具体方案
2896. 执行操作使两个字符串相等(2172): 需要先条件转换
特殊子序列dp
比较特殊的一类题型,递推比记忆化搜索好写
计算合法子序列的最长长度、个数、元素和等。
一般定义 f[x] 表示以元素(数字) x 结尾的合法子序列的 xxx 值(比如个数、元素和),从子序列的倒数第二个数转移过来。
2501. 数组中最长的方波(1480)
3202. 找出有效子序列的最大长度 II(1974)
3351. 好子序列的元素之和:一种比较不错的思路,可以通过这题理解特殊 ...
algorithm-dp-misc
更多
待分类整理
需要小技巧的动态规划
石子游戏 V(2087
几块石子 排成一行 ,每块石子都有一个关联值,关联值为整数,由数组 stoneValue 给出。
游戏中的每一轮:Alice 会将这行石子分成两个 非空行(即,左侧行和右侧行);Bob 负责计算每一行的值,即此行中所有石子的值的总和。Bob 会丢弃值最大的行,Alice 的得分为剩下那行的值(每轮累加)。如果两行的值相等,Bob 让 Alice 决定丢弃哪一行。下一轮从剩下的那一行开始。
只 剩下一块石子 时,游戏结束。Alice 的分数最初为 0 。
返回 Alice 能够获得的最大分数 。
示例 1:
12345输入:stoneValue = [6,2,3,4,5,5]输出:18解释:在第一轮中,Alice 将行划分为 [6,2,3],[4,5,5] 。左行的值是 11 ,右行的值是 14 。Bob 丢弃了右行,Alice 的分数现在是 11 。在第二轮中,Alice 将行分成 [6],[2,3] 。这一次 Bob 扔掉了左行,Alice 的分数变成了 16(11 + 5)。最后一轮 Alice 只能将行分成 [ ...
algorithm-dp-backtracking
动态规划回溯
通过回溯找到动态规划过程中的具体路径
具体来说,就是从最终答案开始,根据动态规划转移方程的条件,一步一步往回找
01背包+回溯: 689. 三个无重叠子数组的最大和
完全背包+回溯: 1449. 数位成本和为目标值的最大数字
一维线性dp+回溯: 2901. 最长相邻不相等子序列 II(1899)
algorithm-dp-tree
树形dp
树形动态规划(Tree DP)就是在树形结构上进行的动态规划。
在树形结构中,每个节点通常连接着若干子节点,但只有一个父节点。树形DP利用了树的这种结构特点,在动态规划的过程中以节点为单位进行递推,从叶子节点开始,向上逐层计算直至根节点。
由于树形结构天然地包含了递归特性,因此递归式的DP是一种常用的方法。
换根dp
也叫二次扫描法
通常是先计算以0节点为root出发的结果,记为res[0],而以其它节点为root出发的结果可以通过与res[0]的差值相加得到
834. 树中距离之和
2581. 统计可能的树根数目(2228)
其它树形dp
2920. 收集所有金币可获得的最大积分(2351)
algorithm-dp-digital
数位dp
数位分解:将一个数按照各个数位进行分解,例如将123分解为1、2、3。数位dp主要涉及到对这些数位的状态进行动态规划,通常,状态表示当前处理到的位置、当前已经得到的数值等信息。
可用于解决如数位上包含特定数字、数字之和等问题。
2376. 统计特殊整数(2120)
2719. 统计整数数目(2355)
3260. 找出最大的 N 位 K 回文数(2370)