思路:
与上一题不同的是,这题增加了一个新的限制条件,就是最后一间房子和第一间房子是相连的,意味对于最后一间房和第一间房子只能偷最多只能偷其中的一家,因此最后一间房子和第一间房子需要进行特殊判断。
DP转移方程
主体还是使用fi和gi表示偷和不偷当前(i)房子能够偷的最大值。
特判最后一间房和第一间房子:
(1)第一间房子不偷,最后一间房子可以偷可以不偷。
(1)第一间房子偷,最后一间房子一定不能偷。
代码:
代码语言:javascript复制class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
if (n == 1) {
return nums[0];
}
int ans = INT_MIN;
vector<int> g(n 1); // 不偷
vector<int> f(n 1); // 偷
// 1.第一家不偷
for (int i = 2; i <= n; i ) {
g[i] = max(f[i - 1], g[i - 1]);
f[i] = g[i - 1] nums[i - 1];
}
// 最后一家偷或不偷
ans = max(f[n], g[n]);
// 2.第一家偷
f[1] = nums[0];
g[1] = 0;
for (int i = 2; i <= n; i ) {
g[i] = max(f[i - 1], g[i - 1]);
f[i] = g[i - 1] nums[i - 1];
}
// 最后一家必偷
ans = max(ans, g[n]);
return ans;
}
};