class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size()==1) return nums[0];
if(nums.size()==2) return max(nums[1],nums[0]);
vector<int> dp(nums.size()-1,0);
dp[0]=nums[0];
dp[1]=max(nums[0],nums[1]);
for(int i=2;i<nums.size()-1;i++)
{
dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
}
vector<int> res(nums.size()-1,0);
res[0]=nums[1];
res[1]=max(nums[1],nums[2]);
for(int i=2;i<nums.size()-1;i++)
{
res[i]=max(res[i-1],res[i-2]+nums[i+1]);
}
return max(dp[nums.size()-2],res[nums.size()-2]);
}
};
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size()==1) return nums[0];
if(nums.size()==2) return max(nums[1],nums[0]);
vector<int> dp(nums.size()-1,0);
dp[0]=nums[0];
dp[1]=max(nums[0],nums[1]);
for(int i=2;i<nums.size()-1;i++)
{
dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
}
vector<int> res(nums.size()-1,0);
res[0]=nums[1];
res[1]=max(nums[1],nums[2]);
for(int i=2;i<nums.size()-1;i++)
{
res[i]=max(res[i-1],res[i-2]+nums[i+1]);
}
return max(dp[nums.size()-2],res[nums.size()-2]);
}
};
class Solution {
public:
vector<int> robb(TreeNode* root)
{
if(root==nullptr) return vector<int>{0,0};
vector<int> left=robb(root->left);
vector<int> right=robb(root->right);
int val1=root->val+left[0]+right[0];
int val2=max(left[0],left[1])+max(right[0],right[1]);
return {val2,val1};
}
int rob(TreeNode* root) {
vector<int> res=robb(root);
return max(res[0],res[1]);
}
};