[LeetCode]House Robber和House Robber||

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.

Example 1:
Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.

Example 2:
Input: [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).
Total amount you can rob = 2 + 9 + 1 = 12.

解释:
一看到求最大值最小值或者子字符串种类应该首先想到动态规划,一看这道题目是求money的最大值,使用动态规划一维即可解决,现在主要的难题是求出状态转移方程,题目要求是不能相邻,可得出dp[0]=nums[0],dp[1] = max(dp[0],dp[1])
现在对于第i个数有两种选择要么选要么不选,因此求出选和不选的最大值即可,得dp[i] = max(dp[i-2]+nums[i],dp[i-1])。

C++代码:

class Solution {
public:
    int rob(vector<int>& nums) 
    {
        int len = nums.size();
        if(len==0)
        {
            return 0;
        }
        int *dp = (int*)malloc(sizeof(int)*len);
        dp[0]=nums[0];
        dp[1] = max(nums[0],nums[1]);
        for(int i = 2;i<len;i++)
        {
            dp[i] = max(dp[i-1],nums[i]+dp[i-2]);
        }
        return dp[len-1];
    }
};

运行结果:
这里写图片描述


House Robber II题目描述:

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, 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.

Example 1:

Input: [2,3,2]
Output: 3
Explanation: You cannot rob house 1 (money = 2) and then rob house 3 (money = 2),
because they are adjacent houses.
Example 2:

Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.

解释:
这道题目是上面那道题目的升级版,这道题目多加了一个要求,就是第一个元素和最后一个元素不能同时取用,这样的话,可以分为两种情况:一种是我们一定取第一个元素,最后一个元素一定不取;另一种是第一个元素我们一定不取(可将第一个元素置为0),最后一个元素可取。返回这两种情况的最大值。

C++代码:

class Solution {
public:
    int rob(vector<int>& nums) 
    {
        int len = nums.size();
        if(len==0)
        {
            return 0;
        }
        if(len==1)
        {
            return nums[0];
        }
        //first situation
        int *dp =(int *)malloc(sizeof(int)*len);
        dp[0] = nums[0];
        dp[1] = nums[0];
        for(int i = 2;i<len-1;i++)
        {
            dp[i] = max(dp[i-1],dp[i-2]+nums[i]);
        }
        //second situation
        int *dp2 = (int*)malloc(sizeof(int)*len);
        dp2[0]=0;
        dp2[1] = nums[1];
        for(int j = 2;j<len;j++)
        {
            dp2[j] = max(dp2[j-2]+nums[j],dp2[j-1]);
        }
        return max(dp[len-2],dp2[len-1]);
    }
};

运行结果:

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值