链接
https://leetcode-cn.com/problems/house-robber/
耗时
解题:8 min
题解:12 min
题意
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
思路
小偷在经过每个屋子的时候都有两个选择,偷或者不偷。设 dp[i] 表示偷到第 i 家可以获得的最高金额,那么状态 dp[i] 可以由两个状态转移得到,
- 偷第 i 家,那么 i-1 家就不能偷了,所以只能从 dp[i-2] 转移过来
- 不偷第 i 家,那么 dp[i] 就是偷到第 i-1 家获得的最高金额 dp[i-1]
状态转移方程:
d
p
[
i
]
=
m
a
x
(
d
p
[
i
−
1
]
,
d
p
[
i
−
2
]
+
n
u
m
s
[
i
]
)
dp[i] = max(dp[i-1], dp[i-2]+nums[i])
dp[i]=max(dp[i−1],dp[i−2]+nums[i])
时间复杂度: O ( n ) O(n) O(n)
AC代码
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.empty()) return 0;
int n = nums.size();
vector<int> dp(n+1, 0);
dp[1] = nums[0];
for(int i = 2; i <= n; ++i) {
dp[i] = max(dp[i-1], dp[i-2]+nums[i-1]);
}
return dp[n];
}
};