1. 程式人生 > 實用技巧 >打家劫舍 II

打家劫舍 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]);
    }
}