30 Day Challenge Day 12 | Leetcode 213. House Robber II

题解

Medium

动态规划

将环形数组分解两个数组去处理,即[0:n-2]和[1:n-1]。最后取结果的较大值。

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.empty()) return 0;
        if(nums.size() == 1) return nums[0];
        if(nums.size() == 2) return max(nums[0], nums[1]);
        
        
        int n = nums.size();
        vector<int> dp1(n), dp2(n);
        dp1[0] = nums[0], dp1[1] = max(nums[0], nums[1]);
        dp2[1] = nums[1], dp2[2] = max(nums[1], nums[2]);
        for(int i = 2; i < n-1; i++) {
            dp1[i] = max(dp1[i-1], dp1[i-2] + nums[i]);
        }
        for(int i = 3; i < n; i++) {
            dp2[i] = max(dp2[i-1], dp2[i-2] + nums[i]);
        }

        return max(dp1[n-2], dp2[n-1]);
    }
};
原文地址:https://www.cnblogs.com/casperwin/p/13722248.html