The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night.
Determine the maximum amount of money the thief can rob tonight without alerting the police.
Example 1:
3 / \ 2 3 \ \ 3 1Maximum amount of money the thief can rob = 3 + 3 + 1 = 7 .
Example 2:
3
/ \
4 5
/ \ \
1 3 1
Maximum amount of money the thief can rob =
4
+
5
=
9
.
Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.
f1(node) be the value of maximum money we can rob from the subtree with node as root ( we can rob node if necessary).
f2(node) be the value of maximum money we can rob from the subtree with node as root but without robbing node.
Then we have
f2(node) = f1(node.left) + f1(node.right) and
f1(node) = max( f2(node.left)+f2(node.right)+node.value, f2(node) ).
class Solution(object):
def do(self,root):
if root == None:
return (0,0)
l = self.do(root.left)
r = self.do(root.right)
return (l[1] + r[1] , max(l[1] + r[1] , l[0] + r[0] + root.val))
def rob(self, root):
return self.do(root)[1]

本文介绍了一种使用树形动态规划方法解决特定抢劫问题的算法。在一个特殊的区域中,所有房屋构成了一个二叉树结构,且相邻房屋被抢会导致报警。文章详细解释了如何通过递归方式求解最大抢劫金额,并提供了Python实现代码。
186

被折叠的 条评论
为什么被折叠?



