Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
即将拥有人鱼线的大哥
Fucking Algorithm
提交
53d48955
F
Fucking Algorithm
项目概览
即将拥有人鱼线的大哥
/
Fucking Algorithm
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Fucking Algorithm
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
53d48955
编写于
6月 24, 2020
作者:
5
5ooo
提交者:
labuladong
6月 24, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update:抢房子 C++版本
上级
268ce748
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
114 addition
and
2 deletion
+114
-2
动态规划系列/抢房子.md
动态规划系列/抢房子.md
+114
-2
未找到文件。
动态规划系列/抢房子.md
浏览文件 @
53d48955
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录