目录
一、打家劫舍原题
原题力扣198 . - 力扣(LeetCode)
int rob(vector<int>& nums)
{
int n = nums.size();
if (n == 1)
{
return nums[0];
}
if (n == 2)
{
return max(nums[0], nums[1]);
}
vector<int> dp(n);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for (int i = 2; i < n; i++)
{
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
}
return dp[n - 1];
}
二、打家劫舍III(树形DP)
原题力扣337 . - 力扣(LeetCode)
vector<int> dfs_rob3(TreeNode* root)
{
if (root == nullptr)
{
return { 0, 0 };
}
vector<int> robleft = dfs_rob3(root->left);
vector<int> robright = dfs_rob3(root->right);
int val0 = max(robleft[0], robleft[1]) + max(robright[0], robright[1]); // 不偷当前节点
int val1 = root->val + robleft[0] + robright[0]; // 偷当前节点
return { val0, val1 };
}
int rob3(TreeNode* root)
{
vector<int> ans = dfs_rob3(root);
return max(ans[0], ans[1]);
}