提交 53d48955 编写于 作者: 5 5ooo 提交者: labuladong

Update:抢房子 C++版本

上级 268ce748
......@@ -230,9 +230,122 @@ int[] dp(TreeNode root) {
![labuladong](../pictures/labuladong.jpg)
[5ooo](https://github.com/5ooo) 提供 House Robber I C++ 解法代码:
```c++
class Solution {
public:
int rob(vector<int>& nums) {
int dp_i = 0; //第i间房子最多能抢的钱
int dp_i_1 = 0; //第i+1间房子最多能抢的钱
int dp_i_2 = 0; //第i+2间房子最多能抢的钱
//从最后一间房子开始,往前移动
for (int i = nums.size() - 1; i >= 0; i--) {
dp_i = max(dp_i_1, nums[i] + dp_i_2);
dp_i_2 = dp_i_1;
dp_i_1 = dp_i;
}
return dp_i;
}
};
```
[5ooo](https://github.com/5ooo) 提供 House Robber II C++ 解法代码:
```c++
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.size() == 1)
return nums[0];
return max(robRange(nums, 0, nums.size() - 2),
robRange(nums, 1, nums.size() - 1));
}
int robRange(vector<int>& nums, int start, int end) {
int dp_i = 0; //第i间房子最多能抢的钱
int dp_i_1 = 0; //第i+1间房子最多能抢的钱
int dp_i_2 = 0; //第i+2间房子最多能抢的钱
for (int i = end; i >= start; i--) {
dp_i = max(dp_i_1, nums[i] + dp_i_2);
dp_i_2 = dp_i_1;
dp_i_1 = dp_i;
}
return dp_i;
}
};
```
[5ooo](https://github.com/5ooo) 提供 House Robber III C++ 解法代码:
```c++
class Solution {
public:
int rob(TreeNode* root) {
if (root == nullptr)
return 0;
// 利用备忘录消除重叠子问题
if (memo.find(root) != memo.end())
return memo[root];
// 抢,然后去下下家
int do_it = root->val +
(root->left == nullptr ?
0 : rob(root->left->left) + rob(root->left->right)) +
(root->right == nullptr ?
0 : rob(root->right->left) + rob(root->right->right));
// 不抢,然后去下家
int not_do = rob(root->left) + rob(root->right);
int ret = max(do_it, not_do);
memo[root] = ret;
return ret;
}
private:
unordered_map<TreeNode *, int > memo;
};
```
```c++
class Solution {
public:
int rob(TreeNode* root) {
//ret[0]表示不抢root,获取的最大钱数
//ret[1]表示抢root,获取的最大钱数
vector<int> ret = dp(root);
return max(ret[0], ret[1]);
}
vector<int> dp(TreeNode* root) {
if (root == nullptr)
return {0, 0};
vector<int> left = dp(root->left);
vector<int> right = dp(root->right);
//抢当前的,则接下来不能抢
int rob = root->val + left[0] + right[0];
//不抢当前的,接下来可抢可不抢,取收益大的
int not_rob = max(left[0], left[1]) + max(right[0], right[1]);
return {not_rob, rob};
}
};
```
[上一篇:团灭 LeetCode 股票买卖问题](../动态规划系列/团灭股票问题.md)
[下一篇:动态规划之四键键盘](../动态规划系列/动态规划之四键键盘.md)
[目录](../README.md#目录)
\ No newline at end of file
[目录](../README.md#目录)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册