198.打家劫舍

题目描述

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

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

题解

假设一共有n间房子,当n<=2时,如果n<=0,那么返回0。否则,返回max(nums[0],nums[1]),当n>2时,采用动态规划解法,用dp[i]表示前i间房子(包括第i间)所能偷窃到的最高金额。此时分为两种情况:

  1. 选择偷窃第i间房子,那么就不能偷窃第i-1间房子,那么dp[i]=dp[i-2]+nums[i]

  2. 选择不偷窃第i间房子,那么dp[i]=dp[i-1]

所以选择这两种情况中dp[i]最大的,即dp[i]=max(dp[i-2]+nums[i],dp[i-1]),最后返回dp[n-1]

代码

c++

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

Java

class Solution {
    public int rob(int[] nums) {
        if(nums==null||nums.length==0)
            return 0;
        int n=nums.length;
        if(n==1)
            return nums[0];
        int[] dp=new int[n];
        dp[0]=nums[0];
        dp[1]=Math.max(nums[0],nums[1]);
        for(int i=2;i<n;++i){
            dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);

        }
        return dp[n-1];
    }
}

题目连接(https://leetcode-cn.com/problems/house-robber/comments/)

posted @ 2020-08-05 19:38  小胖子不哭要站*  阅读(69)  评论(0)    收藏  举报