[LeetCode]House Robber和House Robber||

版权声明:本文为博主原创文章,如要转载请在转载的文章后附上本人博客链接! https://blog.csdn.net/syyyy712/article/details/81569616

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

运行结果:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/syyyy712/article/details/81569616