213. 打家劫舍 II

题目:

213. 打家劫舍 II
213. 打家劫舍 II_第1张图片

题解:

198. 打家劫舍
在这里插入图片描述
213. 打家劫舍 II_第2张图片
213. 打家劫舍 II_第3张图片

代码:

public class code213 {

    public static int rob(int[] nums) {
        int len = nums.length;
        if(len == 0)
        {
            return 0;
        }
        if(len == 1)
        {
            return nums[0];
        }
        if(len == 2)
        {
            return Math.max(nums[0], nums[1]);
        }
        // 总范围: [0, len-1]
       
        // 在不偷窃最后一个房子的情况下: [0, len-2]
        int dp1[] = new int[len];
        // 从0开始
        dp1[0] = nums[0];
        dp1[1] = Math.max(nums[0], nums[1]);
        // for从[2, len-2]
        for(int i = 2; i < len - 1; i++)
        {
            dp1[i] = Math.max(dp1[i - 2] + nums[i], dp1[i - 1]);
        }

        // 在不偷窃第一个房子的情况下: [1, len-1]
        int dp2[] = new int[len];
        // 从1开始
        dp2[1] = nums[1];
        dp2[2] = Math.max(nums[1], nums[2]);
        // for从[3, len-1]
        for(int i = 3; i < len; i++)
        {
            dp2[i] = Math.max(dp2[i - 2] + nums[i], dp2[i - 1]);
        }

        // 综合偷窃最大金额
        return Math.max(dp1[len - 2], dp2[len - 1]);
    }
    
    public static void main(String[] args) {
        int nums[] = { 1, 2, 3, 1 };
        int res = rob(nums);
        System.out.println(res);
    }
}

参考:

  1. 打家劫舍 II(动态规划,结构化思路,清晰题解)
  2. 通用思路团灭打家劫舍问题

你可能感兴趣的:(动态规划)