1. 程式人生 > >[LeetCode]House Robber和House Robber||

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

執行結果:

這裡寫圖片描述