二维 DP 与背包

官官方信息技术老师·7 页·深入(追求细节与边界)·0 次浏览·33 天前
信息技术大学

二维 DP 与背包

数据结构与算法·面试高频 · 第 4 章 算法思想

按 空格/→ 演示下一步

问一句
1 / 7 页

全部页面点击任意一页,跳回舞台从这页播放

信息技术大学

二维 DP 与背包

数据结构与算法·面试高频 · 第 4 章 算法思想

1第 1 页 · 二维 DP 与背包

01 背包与完全背包

每件一件 vs 无限件:转移只差遍历方向,一维优化靠逆序防重复。

01 背包
每件选或不选,一维容量逆序遍历
完全背包
物品无限件,一维容量正序允许重选
遍历顺序
逆序防同一件用两次,正序即表示允许
2第 2 页 · 01 背包与完全背包

零钱兑换系列

凑金额最少几枚、共几种:完全背包换皮,组合与排列的遍历序不同。

最少硬币
dp[amt] = min(dp[amt−coin]+1),不可达留 INF
组合数
外循环钱币内循环金额,不计顺序
排列数
外循环金额内循环钱币,顺序算数
3第 3 页 · 零钱兑换系列

最长公共子序列与编辑距离

两个字符串的二维 DP:相等取对角,不等取三方最小,编辑操作三选一。

LCS
字符相等取对角加一,否则取左右最大
编辑距离
增、删、改三方取最小,可滚动降维
应用
diff 工具、DNA 比对、模糊搜索
4第 4 页 · 最长公共子序列与编辑距离

最长递增子序列及二分优化

O(n²) 经典到 O(n log n):tails 数组存各长度 LIS 的最小结尾。

基础版
dp[i] = 前面更小值的 dp 最大加一
贪心加二分
tails 单调递增,新值二分替换或追加
tails 含义
长度 i 的 LIS 末尾最小值,保证最优子结构
5第 5 页 · 最长递增子序列及二分优化

本节要点

  • ✓01 逆序,完全正序,方向即语义
  • ✓零钱兑换:外循环定组合或排列
  • ✓LCS 与编辑距离:对角与三方
  • ✓LIS:tails 贪心加二分到 n log n
延伸主题:手写 01 背包一维版刷最长递增子序列
6第 6 页 · 本节要点

课后思考

先自己回答,再展开参考答案——能讲出来才算真懂。

101 背包一维优化为什么必须逆序?

参考答案正序时 dp[j−c] 已是本轮更新过的值,等价于该物品被重复选取;逆序用的是上一轮旧值,保证每件只选一次。方向不是技巧,是语义。

2零钱兑换 II 求组合数,为什么外循环必须是钱币?

参考答案外循环钱币让每种面额在金额轴上成批进入,只数组合;若外循环金额,不同顺序被分别计数,数成了排列。遍历顺序决定计数语义。

3LIS 的二分优化为什么能保证正确?

参考答案tails[i] 记录「长度 i+1 的 LIS 的最小结尾」,可证其严格递增;新值替换第一个不小于它的位置,不破坏已有可行性,还让结尾更小、后路更宽。

7第 7 页 · 课后思考