leetcode[198]:House Robber

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.
Example 1:
Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.
Example 2:
Input: [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).
Total amount you can rob = 2 + 9 + 1 = 12.

这道题大概意思是给一个数组,不能选择相邻的数字,选出这个数组的最大不相邻子数组之和。这道题感觉好解,但是有一个点:不能选相邻的。意味着我可以选1,3,5,7,9,或者1,3,6,8,10。这其中距离有差2的,有差3的。所以单纯用距离2去计算转移状态是错误的。下面是我的算法:

    public static int rob(int[] nums) {
    	int length = nums.length;
    	if(length==0){
    		return 0;
    	}
    	if(length==1){
    		return nums[0];
    	}
        if(length==2){
        	return Math.max(nums[0], nums[1]);
        }
    	int f[] = new int[length];
    	f[0]=nums[0];
    	f[1] = nums[1];
    	f[2] = Math.max(nums[0]+nums[2],nums[2]);
    	for (int i = 3; i < nums.length; i++) {
			f[i] = Math.max(Math.max(f[i-2], f[i-3])+nums[i], f[i-1]);
		}
        
    	int res=Integer.MIN_VALUE;
    	for (int i = 0; i < f.length; i++) {
			res=f[i]>res?f[i]:res;
		}
    	return res;
    }

leetcode[198]:House Robber_第1张图片

你可能感兴趣的:(算法设计)