打家劫舍 II

破环:

3种情况:

1、选头不选尾

2、选尾不选头

3、不选头和尾

题目变化成打家劫舍1版本了,设置两个dp,一个舍去头一个舍去尾,之后比较两者最大值即可。


class Solution {
    public int rob(int[] nums) {
        int n = nums.length;
        if (n == 0)   return 0;
        if (n == 1)    return nums[0];
        if(nums.length == 2) return Math.max(nums[0],nums[1]);
        
        int[] dp1 = new int[n];//截止到第i家打劫的最大钱数
        int[] dp2 = new int[n];
        dp1[0] = nums[0];
        dp1[1] = Math.max(nums[0], nums[1]);
        for (int i = 2; i < n-1; i++) {//去尾      
            dp1[i] = Math.max(dp1[i - 1], dp1[i - 2] + nums[i]);
        }
        dp2[1] = nums[1];
        dp2[2] = Math.max(nums[1], nums[2]);
        for (int i = 3; i < n; i++) {//去头      
            dp2[i] = Math.max(dp2[i - 1], dp2[i - 2] + nums[i]);
        }        
        return Math.max(dp1[n-2],dp2[n-1]);
    }
}

原文地址:https://www.cnblogs.com/cstdio1/p/13454711.html