关于LeetCode中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.

    题目的意思就是一个窃贼要盗窃一条街上的房子。每个房子里有固定数量的钱,窃贼如果在一个晚上偷了两个相邻的房子就会触发警报,警察就会来抓这个窃贼。那么,怎样一个盗窃方案能使窃贼拿到的钱最多且不触发警报。

    这道题我没做出来,先来看一下评论区的回答,下面这个代码是赞同数比较多的,地址在这里:https://discuss.leetcode.com/topic/11082/java-o-n-solution-space-o-1,代码如下:

public int rob(int[] num) {
    int[][] dp = new int[num.length + 1][2];
    for (int i = 1; i <= num.length; i++) {
        dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);
        dp[i][1] = num[i - 1] + dp[i - 1][0];
    }
    return Math.max(dp[num.length][0], dp[num.length][1]);
}
   稍微解释一下这个代码,dp这个二维数组代表盗窃前i栋房子带来的最大收益,其中第二维一共有两个选择分别是0和1。0代表不盗窃第i栋房子,1代表盗窃第i栋房子。换句话就是说,dp[i][0]代表盗窃前i栋房子的最大收益,但是不包括第i栋房子的(因为没有盗窃第i栋房子),而dp[i][0]代表盗窃前i栋房子的最大收益,其中包括了第i栋房子的(因为第i栋房子被盗窃了)。

   其实对一栋房子来说,结果无非是两种,被盗窃和没被窃。所以说,才会有之前分0和1两种情况进行讨论。如果第i栋房子没被盗窃的话,那么dp[i][0] = dp[i-1][0]和dp[i-1][1]中的最大值。这个比较好理解,如果第i栋房子没被窃,那么最大总收益dp[i][0]一定和dp[i-1][0],dp[i-1][1]这两个之中最大的相同。而假若第i栋房子被窃,那么dp[i][1]一定等于第num[i-1](注意,这里的i是从1开始的,所以i-1正好对应num中的第i项,因为num中的index是从0开始的)+dp[i-1][0],因为第i栋房子已经被窃了,第i-1栋房子肯定不能被窃,否则会触发警报,所以我们只能取dp[i-1][0]即第i-1栋房子没被窃情况的最大值。循环结束,最后返回dp[num.length][0]和dp[nums.length][1]较大的一项。

    这道问题属于动态规划问题,你打开问题的tags会发现“Dynamic programming”即动态规划的字样,动态规划我也不是很懂建议大家直接去看算法导论吧。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值