LeetCode 213. 打家劫舍 II

//动态规划,198的升级版
//在于怎样处理 首尾房子,它们之中只能抢一个
//Math(抢首,抢尾)
class Solution {
    public int rob(int[] nums) {
        //没房子
        if(nums.length == 0) return 0;
        //一间房子,没得选,必抢
        if(nums.length == 1) return nums[0];
        //俩间及俩间以上
        return Math.max(rob(nums,0,nums.length - 2),rob(nums,1,nums.length - 1));
    }
    private int rob(int[] nums,int start,int end){
        int pre = 0;
        int cur = 0;
        for(int i = start;i <= end;i++){
            //循环开始时, cur 代表 dp[k - 1]; pre 代表 dp[k - 2];
            // dp[k] = Math.max(dp[k -1],dp[k-2] + num[i])
            int tmp = Math.max(cur,pre + nums[i]);
            pre = cur;
            cur = tmp;
            //循环结束后cur代表dp[k],pre 代表 dp[k - 1];
        }
        return cur;
    }
}
原文地址:https://www.cnblogs.com/peanut-zh/p/13909940.html