leetcode 198. House Robber

原创 2016年06月01日 15:26:28

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

LeetCode#198. House Robber

You are a professional robber planning to rob houses along a street. Each house has a certain amount...

leetcode 198 & 213:House Robber

一.House Robber I 的题意是:有一排商铺,强盗不能连续抢劫相邻的两家,否则会触动报警器,求强盗在不触动报警器的前提下,可以抢劫的最多金钱总和。(输入一维数组,从中选择若干个数,使得这些数...

LeetCode动态规划198. House Robber思路解析

LeetCode动态规划198. House Robber思路解析,用最容易理解的递归解释

leetcode 198 House Robber

今天看了一个华为西安研究院的一个女生代码大神的总结很有感悟,下面这句话送给大家:只有好的程序员才能写出人类可以理解的代码You are a professional robber planning t...

Leetcode 198. House Robber

You are a professional robber planning to rob houses along a street. Each house has a certain amount...

Leetcode[198]-House Robber

You are a professional robber planning to rob houses along a street. Each house has a certain amount...

Leetcode_198_House Robber

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/47680663 You are a profes...

LeetCode - 198. House Robber

每一个house都有rob和not rob两种状态,所以我们可以使用一个[n][2]的矩阵来记录每个房子被抢和不被抢的情况下所累计的钱的数量,这道动态规划问题的四要素如下: state: f[i][...

LeetCode 198 House Robber(强盗盗窃最大值)(动态规划)(*)

翻译你是一个专业强盗,并计划沿街去盗窃每一个住户。每个房子都有一定量的现金,阻止你盗窃的唯一阻碍是相邻的两个房子之间有安全系统。一旦这两个房子同时被盗窃,系统就会自动联系警察。给定一系列非负整数代表每...
  • NoMasp
  • NoMasp
  • 2016年01月22日 11:09
  • 2158

House Robber - LeetCode 198

题目描述: You are a professional robber planning to rob houses along a street. Each house has a certain...
  • bu_min
  • bu_min
  • 2015年04月24日 22:07
  • 292
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode 198. House Robber
举报原因:
原因补充:

(最多只允许输入30个字)