pair<int,int> robHelper(TreeNode* root) { if(root==NULL) { return make_pair(0,0); } pair<int,int> left = robHelper(root->left); pair<int,int> right = robHelper(root->right); int first = left.second+right.second+root->val; int second = max(left.first, left.second) + max(right.first, right.second); return make_pair(first, second); }
int rob(vector<int>& nums) { if (nums.size() == 0) { return 0; } if (nums.size() == 1) { return nums[0]; } return max(robHelper(nums, 0, nums.size() - 1), // [first, last) robHelper(nums, 1, nums.size())); // [second, last + 1) }
int robHelper(int* nums, int numsSize,int start){ if(nums==NULL||numsSize<1||numsSize<=start){ return 0; } if(result[start]!=-1){ return result[start]; } int res1=robHelper(nums,numsSize,start+2); int res2=robHelper(nums,numsSize,start+3); int res=nums[start]+max(res1,res2) result[start]=res; return ; }
int rob(int* nums, int numsSize) { if(nums==NULL||numsSize<1){ return 0; } result=(int *)malloc(numsSize*sizeof(int)); if(result==NULL){ exit(EXIT_FAILURE); } memset(result,-1,numsSize*sizeof(int));//初始化为-1 int fristElementMax=robHelper(nums,numsSize,0);//第一个元素被盗后产生的最大值 int secondElementMax=robHelper(nums,numsSize,1);//第二个元素被盗后可能产生的最大值 return fristElementMax>secondElementMax?fristElementMax:secondElementMax; }
vector<int> robHelper(TreeNode* root) { if(root == NULL) { return vector<int>(2,0); } vector<int> left = robHelper(root->left); vector<int> right = robHelper(root->right); vector<int> res; // res[0] : pick up root res.push_back(left[1] + right[1] + root->val); // res[1] : no root obviously res.push_back(max(left[0],left[1]) + max(right[0],right[1])); return res; }
int rob(TreeNode* root) { pair<int,int> p=robHelper(root); return max(p.first,p.second); }
int rob(TreeNode* root) { vector<int> dp = robHelper(root); return max(dp[0], dp[1]); }
int rob(vector<int>& nums) { if(nums.size() == 0) return 0; if(nums.size() == 1) return nums[0]; int n = nums.size(); return max(robHelper(nums,0,n-2),robHelper(nums,1,n-1)); }