打家劫舍(DP问题)

1. 针对问题

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

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

2. 分析问题

213 是在198的基础上进行变形的,我们需要了解一下变形的规则

213的首尾不能相连,可以拆解成求198问题的(0, len - 2) 和(1, len -  1)两段的最大值。

3. 代码解答

198:

class Solution {
    public int rob(int[] nums) {
        int len = nums.length;
        if(len == 1) return nums[0];
        if(len == 2) return Math.max(nums[0], nums[1]);
        int[] dp = new int[len];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        for(int i = 2; i < len; i++) {
            dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
        }
        return Math.max(dp[len - 1], dp[len - 2]);
    }
}

213:

class Solution {
    public int rob(int[] nums) {
        int len = nums.length;
        if(len == 1) return nums[0];
        if(len == 2) return Math.max(nums[0], nums[1]);
        return Math.max(robSub(nums, 0, len - 2), robSub(nums, 1, len - 1));
    }

    int robSub(int[] nums, int l, int r) {
        if(r - l == 1) return Math.max(nums[l], nums[r]);
        int[] dp = new int[r - l + 1];
        dp[0] = nums[l];
        dp[1] = Math.max(nums[l], nums[l + 1]);
        for(int i = 2; i <= (r - l); i++) {
            dp[i] = Math.max(dp[i - 2] + nums[l + i], dp[i - 1]);
        }
        return Math.max(dp[r - l], dp[r - l - 1]);

    }
}

 

posted @ 2022-06-09 19:58  小白的学习  阅读(45)  评论(0)    收藏  举报