这是一道dp题目,需要拆解子问题,分析如下:
a点可抢劫的最大值,包括两种情况,包含a点、不包含a点。
包含a点,其左右节点就不能包含;
不包含a点,则为其左右节点可抢劫最大值之和。
1 | best_with(a) = a.val + best_without(b) + best_without(c) |
按照上面的解法,写出代码。
1 | /** |
可是提交时,会有TLE。我们在计算子节点可抢劫的最大值时进行了重复计算。从下面的代码里,可以看出有重复计算。
1 | rob(root.left.left) |
使用的方法:在计算节点可抢劫的最大值时,存储包含当前节点的最大值best_with和不包含当前节点的最大值best_without,返回一个数组。
1 | /** |
robber[1]存储的是在包含当前节点的情况下,当前节点可抢劫的最大值。
robber[0]存储的是在不包含当前节点情况下,当前节点可抢劫的最大值。
参考:
http://blog.csdn.net/happyaaaaaaaaaaa/article/details/50880121
https://docs.google.com/document/d/1NPojCYmFOSg-GvYfOKKS6dkp6VBNbjVmYho5nl8YI3M/edit#heading=h.8xfeu8ymemfz