echo

任生命穿梭 时间的角落

0%

动态规划总结

坐标型动态规划

是最简单的动态规划类型,通常给定一个序列或网格,记为 A。需要找到序列中某个/些子序列或网格中的某条路径

  1. 某种性质最大/最小
  2. 计数
  3. 存在性

动态规划方程 f[i]中的下标 i表示以A[i]为结尾的满足条件的子序列性质,f[i][j]中的下标i, j表示以A[i][j]为结尾的满足条件的路径的性质。这些性质可能是:

  • 最大值/最小值
  • 个数
  • 是否存在

坐标型动态规划的初始条件f[0]就是指以A[0]为结尾的子序列的性质,对于网格,初始条件f[0][0]就是以A[0][0]为结尾的子序列的性质。

674. 最长连续递增序列

64. 最小路径和

553 · 炸弹袭击 - LintCode

序列型动态规划

给定一个序列,动态规划方程 f[i]中的下标 i表示前 i个元素 A[0], A[1], …, A[i - 1]的某种性质,初始化时f[0]表示空序列的性质。

516 · 房屋染色 II - LintCode

392 · 打劫房屋 - LintCode

534 · 打劫房屋 II - LintCode

149 · 买卖股票的最佳时机 - LintCode

150 · 买卖股票的最佳时机 II - LintCode

151 · 买卖股票的最佳时机 III - LintCode

393 · 买卖股票的最佳时机 IV - LintCode

image-20210803154845696

最长序列型动态规划

给定一个序列,要求找出符合条件的最长子序列

方法:

  • 记录以每个元素 i 结尾的最长子序列的长度
  • 计算时,在 i 之前枚举子序列的上一个元素

397 · 最长上升连续子序列 - LintCode

76 · 最长上升子序列 - LintCode

602 · 俄罗斯套娃信封 - LintCode

划分型动态规划

513 · 完美平方 - LintCode

108 · 分割回文串(二) - LintCode

437 · 书籍复印 - LintCode

image-20210803155745658

博弈型动态规划

394 · 硬币排成线 - LintCode

背包问题

92 · 背包问题 - LintCode

563 · 背包问题 V - LintCode

564 · 组合总和 IV - LintCode

125 · 背包问题(二) - LintCode

440 · 背包问题 III - LintCode

image-20210805110903881

区间型动态规划

给定一个序列/字符串,进行一些操作,最后一步将序列/字符串去头去尾, 剩下的会是一个区间[i, j],状态自然定义为 f[i][j],表示面对子序列[i, ..., j]时的最优性质。

667 · 最长的回文序列 - LintCode

396 · 硬币排成线 III - LintCode

430 · 攀爬字符串 - LintCode

168 · 吹气球 - LintCode

双序列型动态规划

77 · 最长公共子序列 - LintCode

29 · 交叉字符串 - LintCode

119 · 编辑距离 - LintCode

118 · 不同的子序列 - LintCode

154 · 正则表达式匹配 - LintCode

192 · 通配符匹配 - LintCode

image-20210808203541323

668 · 一和零 - LintCode

91 · 最小调整代价 - LintCode

622 · 青蛙跳 - LintCode

436 · 最大正方形 - LintCode