代码随想录第四十八天|打家劫舍系列
Leetcode198.打家劫舍
题目链接:Leetcode198.打家劫舍
太简单了也
class Solution {
public:
int rob(vector<int>& nums) {
vector<int>dp(nums.size(),0);
dp[0]=nums[0];
if(nums.size()==1) return dp[0];
dp[1]=max(nums[0],nums[1]);
for(int i=2;i<nums.size();i++){
dp[i]=max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[nums.size()-1];
}
};
Leetcode213.打家劫舍II
题目链接:Leetcode213.打家劫舍II
二刷提醒
class Solution {
private:
int noob(vector<int>& nums,int start,int end){
if (end==start) return nums[start];
vector<int> dp(nums.size());
dp[start]=nums[start];
dp[start+1]=max(nums[start],nums[start+1]);
for (int i=start+2;i<=end;i++) {
dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
}
return dp[end];
}
public:
int rob(vector<int>& nums) {
if(nums.size()==1) return nums[0];
int head=noob(nums,0,nums.size()-2);
int tail=noob(nums,1,nums.size()-1);
return max(head,tail);
}
};
Leetcode337.打家劫舍III
题目链接:Leetcode337.打家劫舍III
这道题真的无敌,把DFS和动归完美缝合在一起了,出这道题的人是个天才。可惜我不是
二刷提醒
class Solution {
private:
vector<int> backtracking(TreeNode* cur){
if(cur==NULL) return {
0,0};
vector<int> left=backtracking(cur->left);
vector<int> right=backtracking(cur->right);
//偷,存在【0】
int val0=cur->val+left[1]+right[1];
//不偷,存在【1】
int val1=max(left[0],left[1])+max(right[0],right[1]);
return {
val0,val1};
}
public:
int rob(TreeNode* root) {
vector<int> res=backtracking(root);
return max(res[0],res[1]);
}
};