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