leetcode198. 打家劫舍

Posted 任仁人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode198. 打家劫舍相关的知识,希望对你有一定的参考价值。

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
  偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:

输入: [2,7,9,3,1]
输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
  偷窃到的最高金额 = 2 + 9 + 1 = 12 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/house-robber
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

解题思路:动态规划问题

定义数组dp[i]为偷到第i间屋子时能偷盗的最大数值。

只有一间房屋的时候,没得选择,只能选择偷这家的屋子。

有两间屋子时,选择偷数额大的那间屋子。

当房屋总数大于等于3时,对于第i间屋子,有两种选择

(1)不偷第i间屋子,那么这种情况能偷的总值为dp[i-1]

(2)偷第i间屋子,那么第i-1间屋子就不能偷,那么此时可以偷的数值总数为dp[i-2]+nums[i]

因此状态转移方程定义为

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

边界条件定义为:

dp[0]=nums[0];

dp[1]=max(nums[0],nums[1])

代码如下:

class Solution {

public:
    int rob(vector<int>& nums) {
        if(nums.size()==0)  return 0;
        vector<int>dp;
        dp.resize(nums.size(),0);
        for(int i=0;i<nums.size();i++)
        {
            if(i==0)
                dp[0]=nums[0];
            else if(i==1)
                dp[1]= max(nums[0],nums[1]);
            else
                dp[i] = max(nums[i]+dp[i-2],dp[i-1]);
        }
        return dp[nums.size()-1];

    }
};

 

以上是关于leetcode198. 打家劫舍的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 198. 打家劫舍

LeetCode 198. 打家劫舍

Leetcode 198. 打家劫舍

Leetcode 198. 打家劫舍

LeetCode 198 打家劫舍

我用java刷 leetcode 198. 打家劫舍