#198
Medium
动态规划

House Robber

在不能抢相邻房屋的前提下获得最大金额。

DP

题目定位

这是最经典的“取或不取”DP:每个位置只有两种真正有意义的选择,要么抢当前并跳过前一个,要么不抢当前并继承前一个最优。

关键观察

状态只依赖前一个位置和前两个位置的最优值。

目标复杂度

O(n) / O(1)

这题的解法思路怎么拆

1

这是最经典的“取或不取”DP:每个位置只有两种真正有意义的选择,要么抢当前并跳过前一个,要么不抢当前并继承前一个最优。

2

状态只依赖前一个位置和前两个位置的最优值。

3

先用自然语言命名状态。

4

列出哪些决策会转移到这个状态。

参考实现

Python
# Generic pattern template
# 1D DP
dp = [0] * (n + 1)
dp[0] = base
for i in range(1, n + 1):
    dp[i] = transition(dp, i)

# 2D DP
dp = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
    for j in range(1, m + 1):
        dp[i][j] = transition(dp, i, j)

常见坑点

warning

把当前位置值和全局最优混在一起。

warning

短数组 base case 没处理干净。

高频追问

如果房子首尾相邻,House Robber II 怎么改?

能把它解释成两个滚动状态吗?

继续刷相关题

先把 动态规划 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 198. House Robber 题解思路 | Interview AiBox