198.打家劫舍
198.打家劫舍
回溯法:
class Solution {
public:
int maxMoney = 0;
void backtracking(int index, int& sum,
vector<int>& nums) { // index表示上一个偷过的房屋号
if (index +2> nums.size()-1) {
maxMoney = max(sum, maxMoney);
return;
}
for (int i = index + 2; i < nums.size(); i++) {//待选择列表:除了下家不能抢,往后的每一家都可以去抢
sum += nums[i];
backtracking(i, sum, nums);
sum -= nums[i];
}
}
int rob(vector<int>& nums) {
backtracking(0,nums[0],nums);
if(nums.size()>1)backtracking(1,nums[1],nums);
return maxMoney;
}
};
动态规划法:
class Solution {
public:
int rob(vector<int>& nums) {
//f[i]表示从0~i抢劫得到的最大金额
//f[i]=f[i-1]或者f[i-2]+nums[i].
int *f=new int[nums.size()];
f[0]=nums[0];
if(nums.size()>1)f[1]=max(nums[0],nums[1]);
for(int i=2;i<nums.size();i++){
f[i]=max(f[i-1],f[i-2]+nums[i]);
}
return f[nums.size()-1];
}
};

浙公网安备 33010602011771号