这个题和打家劫舍I思路相同,只不过这里分两种情况:盗第一间和不盗第一间(至于最后一间根据dp进行选择)进行dp即可。
//思路和198题类似,只不过这里分两种情况讨论:盗第一间和不盗第一间
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.empty())
return 0;
if (nums.size() == 1)
return nums[0];
int size = nums.size();
vector<int> dp1(size); //保存在不盗第一间的情况下最大利益
vector<int> dp2(size); //保存在盗第一间的情况下的最大利益
dp1[0] = 0; //不盗第一间
dp1[1] = nums[1];
for (int i = 2; i < size; ++i) {
dp1[i] = max(dp1[i-2] + nums[i], dp1[i-1]);
}
dp2[0] = nums[0]; //盗第一间
dp2[1] = max(nums[0], nums[1]);
for (int i = 2; i < size - 1; ++i) { //不盗最后一间
dp2[i] = max(dp2[i-2] + nums[i], dp2[i-1]);
}
return max(dp1[size-1], dp2[size-2]);
}
};