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