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];
    }
};
posted @ 2025-03-19 22:26  Cheauncey  阅读(21)  评论(0)    收藏  举报