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

[LeetCode] House Robber II

1、題目

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.

2、分析

這個其實還是原來的方法,只不過街道變成了圓形,第一個和最後一個是相鄰的。一開始我是不知道怎麼處理這種情況的,然後找了找答案發現,分別計算去頭去尾的最大可能結果,兩個取最大值就是最終結果,仔細思考了一下發現十分有道理。

3、程式碼

class Solution {
public:
    int rob(vector<int>& nums) {
        int m1 = 0,m2=0;
        int n = nums.size();
        if(n==0) return 0;
        if(n==1) return nums[0];
        if(n==2) return max(nums[0],nums[1]);
        return max(rob(nums,0,n-1),rob(nums,1,n));
    }
        int rob(vector<int>& nums,int left,int right)
        {
            if(right - left == 2) return max(nums[left],nums[right-1]);
            int nn = right - left;
            int dp[nn];
            dp[0] = nums[left];
            dp[1] = max(nums[left],nums[left+1]);
            for(int i=2;i<nn;i++)
                dp[i] = max(dp[i-2]+nums[i+left],dp[i-1]);
            return dp[nn-1];
        }
        
    
};