Day48 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

文章目录

  • 198.打家劫舍
  • 213.打家劫舍II
  • 337.打家劫舍III

198.打家劫舍

https://leetcode.cn/problems/house-robber/
dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.size() == 1) return nums[0];
        vector<int> dp(nums.size());
        dp[0] = nums[0];
        dp[1] = max(nums[0], nums[1]);
        for(int i = 2; i < nums.size(); i++){
            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
        }
        return dp[nums.size() - 1];
    }
};

213.打家劫舍II

https://leetcode.cn/problems/house-robber-ii/

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.size() == 1) return nums[0];
        int res1 = rob(nums, 0, nums.size() - 2);
        int res2 = rob(nums, 1, nums.size() - 1);
        return max(res1, res2);
    }

    int rob(vector<int>& nums, int l, int r){
        if(l == r) return nums[l];
        vector<int> dp(nums.size());
        dp[l] = nums[l];
        dp[l + 1] = max(nums[l], nums[l + 1]);
        for(int i = l + 2; i <= r; i++){
            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
        }
        return dp[r];
    }
};

337.打家劫舍III

https://leetcode.cn/problems/house-robber-iii/

class Solution {
public:
    vector<int> robTree(TreeNode* cur){
        if(cur == NULL) return {0, 0};
        vector<int> left = robTree(cur->left);
        vector<int> right = robTree(cur->right);
        int val1= cur->val + left[0] + right[0];
        int val2 = max(left[0], left[1]) + max(right[0], right[1]);
        return {val2, val1};
    }

    int rob(TreeNode* root) {
        vector<int> dp = robTree(root);
        return max(dp[0], dp[1]);
    }
};

树形dp的入门题目
p数组(dp table)以及下标的含义:下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。
如果是偷当前节点,那么左右孩子就不能偷,val1 = cur->val + left[0] + right[0]; (如果对下标含义不理解就再回顾一下dp数组的含义)
如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:val2 = max(left[0], left[1]) + max(right[0], right[1]);
最后当前节点的状态就是{val2, val1}; 即:{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱}

你可能感兴趣的:(leetcode,算法,动态规划)