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.

这是个动态规划问题。为了便于理解,咱们先去掉一个条件,不允许两个相邻的数选择。那么我们的状态转移方程就好写了

dp[i] = max(dp[i-1] , dp[i-1]+nums[i-1])) ,其中dp表示第i个房间选择之后,累计总金额。

那么现在我们在改写一下这个式子

dp[i] = max(dp[i-1], max(dp[i-2], dp[i-2]+nums[i-2])+nums[i-1])

现在我们把不允许相邻的两个数选择的条件加上, 那么nums[i-2]不能选,就设为0,上式变为

dp[i] = max(dp[i-1] , max(dp[i-2], dp[i-2]+0) +nums[i-1]);

dp[i]= max(dp[i-1] , dp[i-2]+ nmus[i-1]);

这样我们就推导出转移方程了。

代码就简单了。

/**
 * Created by kyle on 2016/6/1.
 */
public class HouseRobber {
    /******
     * 动态规划问题,每一步的状态依赖于两个决策,1,上一步是否选取,2,在上一步没选取的状态下,这一步是否选取.

     上一步没有选取 那么dp[i] = dp[i-2]+ nums[i-1];

     上一步选取了 ,这一步不能选了, dp[i] = dp[i-1];

     那么dp[i]的最优解为max(dp[i-2]+ nums[i-1], dp[i-1]);
     * @param nums
     * @return
     */
    static  public  int  houseRobber(int[] nums){
        if(nums == null || nums.length <1){
            return 0;
        }
        int[] dp = new int[nums.length+1];
        dp[0] = 0;
        dp[1] = nums[0];

        for(int i = 2; i< nums.length+1; i++){
            dp[i]= Math.max(dp[i-1], dp[i-2]+ nums[i-1]);
        }
        return  dp[nums.length];
    }
    static  public  void main(String[] a){
        int[] nums={2,4, 5 ,8,1,9,8,3,0,7,6};
        int profit = houseRobber(new int[0]);
        System.out.println("profit  is :" + profit);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值