leetcode[198]:House Robber

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bless2015/article/details/88136079

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;
    }

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/bless2015/article/details/88136079
今日推荐