2023.8.20
本题是 打家劫舍 的进阶版,房屋之间形成一个环了,也就是第一个房屋和最后一个房屋不能一起偷了。那么能偷的情况分为下列三种:
- 不考虑偷首房间。
- 不考虑偷尾房间。
- 不考虑偷首尾房间。
第三种情况包含于第一和第二种情况了,所以分别为第一种和第二种情况设两个dp数组,再用昨天 打家劫舍 的思路做就行。 下面上代码:
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size()==0) return 0;
if(nums.size()==1) return nums[0];
vector<int> dp1(nums.size());
vector<int> dp2(nums.size());
dp1[0] = dp2[0] = 0;
dp1[1] = nums[0];
dp2[1] = nums[1];
for(int i=2; i<=nums.size()-1; i++)
{
dp1[i] = max(dp1[i-1] , dp1[i-2]+nums[i-1]);
}
for(int i=2; i<=nums.size()-1; i++)
{
dp2[i] = max(dp2[i-1] , dp2[i-2]+nums[i]);
}
if(dp1[nums.size()-1] > dp2[nums.size()-1]) return dp1[nums.size()-1];
else return dp2[nums.size()-1];
}
};
附上打的草稿以供参考: