leetcode 198. House Robber

来源:互联网 发布:如何下载软件 编辑:程序博客网 时间:2024/06/13 06:45

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


0 0