198. 打家劫舍
初始版打家劫舍,dp数组代表最大偷多少
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size()==1)return nums[0];
vector<int> dp(nums.size());
dp[0]=nums[0];
dp[1]=max(nums[0],nums[1]);
for(int i=2;i<dp.size();i++){
dp[i]=max(dp[i-1],nums[i]+dp[i-2]);
}
return dp.back();
}
};
213. 打家劫舍
加一个对于去头去尾两种模式的相比较
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size()==1)return nums[0];
int res1=rrrrob(nums,0);
int res2=rrrrob(nums,1);
return max(res1,res2);
}
int rrrrob(vector<int>& nums,int begin){
vector<int> dp(nums.size()-1);
if(dp.size()==1)return nums[begin];
dp[0]=nums[begin];
dp[1]=max(nums[begin],nums[begin+1]);
for(int i=2;i<dp.size();i++){
dp[i]=max(dp[i-1],nums[i+begin]+dp[i-2]);
}
return dp.back();
}
};
337. 打家劫舍 III
思路不大一样,dp数组为每个结点的属性,偷与不偷的最大值
class Solution {
public:
vector<int> finding(TreeNode* root){
if(root==nullptr)return {0,0};
vector<int> left=finding(root->left);
vector<int> right=finding(root->right);
vector<int> dp(2);
dp[0]=max(left[1],left[0])+max(right[1],right[0]);
dp[1]=root->val+left[0]+right[0];
return dp;
}
int rob(TreeNode* root) {
vector<int>res=finding(root);
return max(res[0],res[1]);
}
};