nianhua120的专栏

转载请注明csdn的地址,谢谢。

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


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nianhua120/article/details/51556151
文章标签: leetcode house robber dp
个人分类: 算法
上一篇LeetCode162. Find Peak Element
下一篇LeetCode 200. Number of Islands
想对作者说点什么? 我来说一句

leetcode solution

2018年06月07日 1.15MB 下载

leetcode java解答答案

2015年12月20日 36KB 下载

leetcode java题解

2015年08月10日 54KB 下载

leetcode经典题目全解析

2018年05月27日 1.09MB 下载

LeetCode题库答案(数据库)

2018年04月28日 416KB 下载

LeetCode java版本练习题

2017年12月06日 383KB 下载

leetcode试题的答案

2018年01月14日 101KB 下载

leetcode C语言全解

2018年04月19日 1.06MB 下载

没有更多推荐了,返回首页

关闭
关闭