一、问题族全景
Mermaid · 渲染中(下方为源码)
graph LR A[打家劫舍] --> B[线性: 选/不选] A --> C[环形: 首尾互斥] A --> D[树形: 子树取舍]
"打家劫舍"是线性 DP 最经典的入门模型族,三道题层层递进:
| 题目 | 结构 | 核心约束 |
|---|---|---|
| LC 198. 打家劫舍 | 一排房屋(线性) | 相邻不能偷 |
| LC 213. 打家劫舍 II | 环形房屋 | 相邻不能偷 + 首尾相邻 |
| LC 337. 打家劫舍 III | 二叉树 | 直接父子不能偷 |
共同本质:在一个有"相邻冲突"约束的结构上,选取权值最大的独立子集。
二、LC 198:线性版本
2.1 状态定义
dp[i] = 考虑前 i 间房屋能偷到的最大金额。
2.2 转移方程
dp[i] = max(dp[i-1], dp[i-2] + nums[i-1])
// 不偷第i间 // 偷第i间(则第i-1间不能偷)
决策直觉:站在第 i 间门口,只有两个选择——跳过它(继承 dp[i-1]),或者偷它(拿 dp[i-2] + 当前金额)。