Problem: 213. 打家劫舍 II
思路
题目在打家劫舍的条件基础上增加了前和尾房间不能偷,相当于房间之间成环,但是还是要破环,找到打劫开始的位置,可能的情况:
- 如果从首房间(0号房间)开始打劫,那么最后一个房间(尾房间,n-1号房间)不能打劫;相似地,(尾房间不打劫)
- 如果从1号房间开始打劫,那么最后一个房间能打劫到;(首房间不打劫)
- 从1号房间开始打劫,打劫到n-2号房间(首尾房间都不打劫)
第3种情况可能会包含在第2种情况下,所以只需要比较第1和2种情况的打劫最大钱数,最大的即为解。
Code
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(n == 1) return nums[0];
if(n == 2) return max(nums[0], nums[1]);
vector<int> dp(n, 0); // 下标表示当前能拿到最大的值
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for(int i = 2; i < n-1; ++i) // 第1种情况
{
dp[i] = max( dp[i-1], dp[i-2]+nums[i] );
}
vector<int> dp2(n, 0); // 下标表示当前能拿到最大的值
dp2[1] = nums[1];
dp2[2] = max(nums[1], nums[2]);
for(int i = 3; i < n; ++i) // 第2种情况
{
dp2[i] = max( dp2[i-1], dp2[i-2]+nums[i] );
}
return max(dp[n-2], dp2[n-1]); // 比较第1和2种情况的打劫最大钱数
}
};