leetcode 213 House Robber II

https://www.cnblogs.com/grandyang/p/4518674.html

第一个和最后一个数字不可以同时选择,所以分为两种情况计算,分别是[0...m-1]和[1....m],取最大值。

计算每个位置的最大值时,该位置i的最大值只和i-1、i-2的值有关。

class Solution {
public:
    int rob(vector<int>& nums) {
        if(nums.empty()) return 0;
        if(nums.size()==1) return nums.front();
        return max(helper(nums,0,nums.size()-1),helper(nums,1,nums.size()));
    }
    int helper(vector<int>& nums,int left,int right) {
        if(right-left<=1) return nums[left];
        vector<int> dp(right,0);
        dp[left]=nums[left];
        dp[left+1]=max(nums[left],nums[left+1]);
        for(int i=left+2;i<right;++i) {
            dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
        }
        return dp.back();
    }
};
原文地址:https://www.cnblogs.com/LiuQiujie/p/12841342.html