198.打家劫舍
class Solution {
public:
int rob(vector<int>& nums) {
int tou = 0;
int no_tou = 0;
for(int i=0; i<nums.size(); i++)
{
int temp = max(tou, no_tou);
tou = no_tou+nums[i];
no_tou = temp;
}
return max(no_tou, tou);
}
};
213.打家劫舍II
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size()==1) return nums[0];
int first_tou =0, first_no_tou = 0;
int no_first_tou =0, no_first_no_tou = 0;
for(int i=0; i<nums.size(); i++)
{
if(i<nums.size()-1) {
int temp =max(first_tou, first_no_tou);
first_tou = first_no_tou+nums[i];
first_no_tou = temp;
}
if(i!=0){
int temp = max(no_first_tou, no_first_no_tou);
no_first_tou = no_first_no_tou + nums[i];
no_first_no_tou = temp;
}
}
return max(max(first_no_tou, first_tou), max(no_first_no_tou, no_first_tou));
}
};
337.打家劫舍III
class Solution {
public:
int rob(TreeNode* root) {
vector<int> dp = back_traversal(root);
return max(dp[0], dp[1]);
}
vector<int> back_traversal(TreeNode* root){
if(root==NULL) return {0,0};
vector<int> left = back_traversal(root->left);
vector<int> right = back_traversal(root->right);
int on_tou = max(left[0],left[1])+max(right[0],right[1]);
int tou = left[1] + right[1] + root->val;
return {tou, on_tou};
}
};