House Robber III

这道题就是把CLRS上面对于DP的递归定义搬上来就解开了,再利用Divide & Conquer的思维,首先每个节点选或者不选是两种情况,必须传一个参数进去判断当前是可以选择选或不选还是只能不选,另外需要一个哈希表备忘当前结果以防多次重复访问,这里注意两种状态的值要分别记录,下面是代码

class Solution(object):
    def rob(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        store = {}
        return self.DFS(root, True, store)

    def DFS(self, root, status, store):
        if not root:
            return 0

        if (root, status) in store:
            return store[(root, status)]

        result = 0
        a = self.DFS(root.left, True, store) + self.DFS(root.right, True, store)
        if status:
            b = root.val + self.DFS(root.left, False, store) + self.DFS(root.right, False, store)
            result = max(a, b)
            store[(root, True)] = result
            return result
        store[(root, False)] = a
        return a

这个题思路真的很奇怪很奇怪,虽然实际上,我们要考虑的就是两种情况,拿当前节点的情况下以它为根的子树的最大值,和不拿当前节点的情况下以它为根的子树的最大值记录下来,用哈希表备忘,最后一直上溯到根节点求得最后结果,思路非常类似于DP里面的记忆化搜索(某种程度上这就是记忆化搜索了)

class Solution(object):
    def rob(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        store = {1:{}, 0:{}}
        result = self.helper(root, 1, store)
        return result

    def helper(self, root, status, store):
        if not root:
            return 0

        if not root.left and not root.right:
            if status:
                return root.val
            return 0

        if root in store[status]:
            return store[status][root]

        if status:
            store[status][root] = max(self.helper(root.left, 0, store) + self.helper(root.right, 0, store) + root.val,
                        self.helper(root.left, 1, store) + self.helper(root.right, 1, store))
            return store[status][root]
        else:
            store[status][root] = self.helper(root.left, 1, store) + self.helper(root.right, 1, store) 
            return store[status][root]

results matching ""

    No results matching ""