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