题目链接:https://leetcode.cn/problems/house-robber-ii/
题目大意:与【打家劫舍I】基本相同,唯一不同的点是,现在房子是一圈排列的,也就是第0
个房子和第n-1
个房子是相邻的。
思路:还是要DP来做。重点是【房子0
和房子n-1
至少有一个不偷】。那么分别考虑两种情况就好。
- 绝对不偷
0
(偷不偷n-1
是未知的,但因为绝对不偷0
,带来的结果就是【我们有权选择是否偷n-1
了】),那么此时相当于考虑一串从1
到n-1
的房子,【圈被剪开了】,做法与【打家劫舍I】相同。 - 绝对不偷
n-1
,同上,相当于考虑一串从0
到n-2
到房子
因此本题的重点就是【考虑绝对不偷某个房子】so that【将圈剪开】,变成【打家劫舍I】的方法来做
完整代码
class Solution {
public:
int rob2(vector<int>& nums, int l, int r) {
if (l == r)
return nums[l];
if (r == l+1)
return max(nums[l], nums[r]);
int len = r-l+1;
vector<int> dp(len);
dp[0] = nums[l];
dp[1] = max(nums[l], nums[l+1]);
for (int i = 2; i < len; i++)
dp[i] = max(dp[i-1], dp[i-2] + nums[l+i]);
return dp[len-1];
}
int rob(vector<int>& nums) {
int N = nums.size();
if (N == 1)
return nums[0];
else if (N == 2)
return max(nums[0], nums[1]);
else;
// if no house_0
int ret1 = rob2(nums, 1, N-1);
// if no house_{n-1}
int ret2 = rob2(nums, 0, N-2);
return max(ret1, ret2);
}
};