【动态规划】198. 打家劫舍 213. 打家劫舍 II
【动态规划】198. 打家劫舍 213. 打家劫舍 II
class Solution {
public:
int rob(vector<int>& nums) {
int num_len = nums.size();
if(num_len == 1)
return nums[0];
else if(num_len == 2)
return nums[0] > nums[1] ? nums[0] : nums[1];
int dp[num_len + 1];
dp[0] = nums[0];
dp[1] = nums[0] > nums[1] ? nums[0] : nums[1];
for(int i=2;i<num_len;++i)
dp[i] = max(dp[i-2] + nums[i], dp[i-1]);
return dp[num_len - 1];
}
};
213. 打家劫舍 II: 所有的房屋都 围成一圈
思路:分类讨论,带头不带尾与带尾不带头;(可以将数组优化去掉,上一题也可以)
class Solution {
public:
int rob(vector<int>& nums) {
int num_len = nums.size();
if(num_len == 1)
return nums[0];
if(num_len == 2)
return max(nums[0], nums[1]);
if(num_len == 3)
return max(nums[0], max(nums[1], nums[2]));
int tmp;
int num01 = nums[0], num02 = max(nums[1], nums[0]);
int num11 = 0, num12 = nums[1];
for(int i=2;i<num_len; ++i){
if(i != num_len - 1){
tmp = num02;
num02 = max(num01 + nums[i], num02);
num01 = tmp;
}
tmp = num12;
num12 = max(num11 + nums[i], num12);
num11 = tmp;
// cout << num02 << " " << num12 << endl;
}
return max(num02, num12);
}
};