该题属于常规的递归和动态规划(DP)思想,直接上答案:
#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
//方法一:递归法,出现LTE错误
class Solution {
public:
int rob(vector<int>& nums) {
if (!nums.size())
return 0;
int max = 0, index = 0, sum = 0, flag = 0;
recursion(nums, index, sum, max, flag);
return max;
}
void recursion(vector<int>& nums, int index, int sum, int& max, int flag) {
if (index == nums.size())
{
if (sum > max)
max = sum;
return;
}
if (flag == 0)
{
//取当前数
recursion(nums, index + 1, sum + nums[index], max, 1);
//或者不取当前数
recursion(nums, index + 1, sum, max, 0);
}
else
//无法取当前数
recursion(nums, index + 1, sum, max, 0);
}
};
//方法二:DP法
class Solution {
public:
int rob(vector<int>& nums) {
if (!nums.size())
return 0;
if (nums.size() == 1)
return nums[0];
if (nums.size() == 2)
return max(nums[0], nums[1]);
vector<int> sumMax(nums.size());
sumMax[0] = nums[0];
sumMax[1] = max(nums[0], nums[1]);
for (int i = 2; i < nums.size(); ++i)
{
sumMax[i] = max((sumMax[i - 2] + nums[i]), sumMax[i - 1]);
}
return sumMax.back();
}
};