[leetcode]House Robber1,2

/**
 * 一、
 * You are a professional robber planning to rob houses along a street.Each house has a certain amount of money stashed,
 * the only constraint stopping you from robbing each of them is that adjacent houses have security system connected
 * and it will automatically contact the police if two adjacent houses were broken into on the same night.

 Given a list of non-negative integers representing the amount of money of each house,
 determine the maximum amount of money you can rob tonight without alerting the police.
 二、
 Note: This is an extension of House Robber.

 After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.

 Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.
 */
/*
* 动态规划的一般套路,创建数组记录到当前这家时可能得到的最大收入,有两种情况,偷这家:res[i-2] + nums[i],不偷这家:res[i-1]
* 状态方程:两种情况取较大的
* 第二题可以分两种情况考虑,一种是偷第一家,则最后一家不偷,第二种就是偷最后一家,第一家不偷,两种情况的较大者就是结果*/
public class Q198HouseRobber {
    public int rob(int[] nums) {
        if (nums.length == 0 )
            return 0;
        int[] res = new int[nums.length+1];
        res[0] = 0;
        res[1] = nums[0];
        for (int i = 2; i < nums.length+1; i++) {
            res[i] = Math.max((res[i-2]+nums[i-1]),res[i-1]);
        }
        return res[nums.length];
    }
    public int rob2(int[] nums){
        if (nums.length == 0 )
            return 0;
        if (nums.length == 1)
            return nums[0];
        int[] res1 = new int[nums.length];
        int[] res2 = new int[nums.length+1];
        //包含第一家的情况,最后一家肯定没有,所以循环的次数减1
        res1[0] = 0;
        res1[1] = nums[0];
        for (int i = 2; i < nums.length; i++) {
            res1[i] = Math.max((res1[i-2]+nums[i-1]),res1[i-1]);
        }
        //不包含第一家的情况,
        res2[0] = 0;
        res2[1] = 0;
        for (int i = 2; i < nums.length+1; i++) {
            res2[i] = Math.max((res2[i-2]+nums[i-1]),res2[i-1]);
        }
        return Math.max(res1[res1.length-1],res2[res2.length-1]);
    }
}
原文地址:https://www.cnblogs.com/stAr-1/p/7486940.html