class Solution { public: int rob(vector<int>& nums) { if (nums.size() == 0) return 0; if (nums.size() == 1) return nums[0]; return max(helper(nums, 0, nums.size()-2), helper(nums, 1, nums.size()-1)); } int helper(vector<int>& nums, int start, int end) { vector<int> dp1(end+1, 0); // choose dp1[start] = nums[start]; vector<int> dp2(end+1, 0); // not choose for (int i = start+1; i <= end; i++) { dp1[i] = dp2[i-1] + nums[i]; // choose it: not choose i-1 dp2[i] = max(dp2[i-1], dp1[i-1]); // not choose it: max(not choose i-1, choose i-1) } return max(dp1[end], dp2[end]); } };