tip:
画出递归树理解求解思路,对于某一个房子,只有抢劫和不抢劫两种选择,如果抢劫当前房子,则不能抢劫相邻的下一个房子,从n-2个房子开始判断;如果不抢劫当前房子则从n-1开始判断.同时发现递归求解时有重复计算,所以采用记忆式搜索.
Solution1:
记忆式递归搜索
class Solution {
private:
vector<int> memo;
int robCore(vector<int>& nums,int n)
{
if(n<0) return 0;//这里的条件很重要,因为是减法操作难免越界
if(n == 0) memo[0]=nums[0];
if(memo[n] == -1)
memo[n] = max(nums[n]+robCore(nums,n-2),robCore(nums,n-1));
return memo[n];
}
public:
int rob(vector<int>& nums) {
int n = nums.size();
memo = vector<int>(n,-1);
return robCore(nums,n-1);
}
};
Solution2:
DP:
class Solution {
private:
vector<int> memo;
int robCore(vector<int>& nums,int n)
{
if(n == 0) return nums[0];
if(n<0) return 0;
for(int i=1;i<=n;i++)
{
if(memo[i] == -1)
memo[i] = max(nums[i]+robCore(nums,i-2),robCore(nums,i-1));
}
return memo[n];
}
public:
int rob(vector<int>& nums) {
int n = nums.size();
memo = vector<int>(n,-1);
return robCore(nums,n-1);
}
};