动态规划_leetcode337

Posted AceKo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划_leetcode337相关的知识,希望对你有一定的参考价值。

#coding=utf-8

# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None


# 递归
class Solution1(object):
def rob(self, root):
"""
:type root: TreeNode
:rtype: int
"""

if not root :
return 0

return self.tryRob(root)


def tryRob(self,root):


if not root:
return 0

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


leftChild = root.left
rightChild = root.right

res = root.val


if leftChild:
res += self.tryRob(leftChild.left)
res += self.tryRob(leftChild.right)
if rightChild:
res += self.tryRob(rightChild.left)
res += self.tryRob(rightChild.right)


res = max(res,self.tryRob(leftChild)+self.tryRob(rightChild))

return res


def createTree1(self):

root = TreeNode(3)
root.left = TreeNode(4)
root.right = TreeNode(5)

root.left.left = TreeNode(1)
root.left.right = TreeNode(3)

root.right.right = TreeNode(1)



return root


def createTree2(self):
root = TreeNode(3)

root.left = TreeNode(2)
root.right = TreeNode(3)

root.left.right = TreeNode(3)
root.right.right = TreeNode(1)

return root



# s = Solution1()
#
# root = s.createTree2()
#
# print s.rob(root)


# 记忆化递归
class Solution2(object):
def rob(self, root):
"""
:type root: TreeNode
:rtype: int
"""

if not root :
return 0

self.memo = {}


return self.tryRob(root)


def tryRob(self,root):


if self.memo.has_key(root):
return self.memo[root]

if not root:
return 0

if root and not root.left and not root.right:
self.memo[root] = root.val
return root.val

else:

res1 = self.tryRob(root.left) + self.tryRob(root.right)

res2 = root.val

if root.left:
res2 += self.tryRob(root.left.left)
res2 += self.tryRob(root.left.right)

if root.right:
res2 += self.tryRob(root.right.left)
res2 += self.tryRob(root.right.right)


res = max(res1,res2)
self.memo[root] = res

return res




def createTree1(self):

root = TreeNode(3)
root.left = TreeNode(4)
root.right = TreeNode(5)

root.left.left = TreeNode(1)
root.left.right = TreeNode(3)

root.right.right = TreeNode(1)



return root


def createTree2(self):
root = TreeNode(3)

root.left = TreeNode(2)
root.right = TreeNode(3)

root.left.right = TreeNode(3)
root.right.right = TreeNode(1)

return root



# s = Solution2()
#
# root = s.createTree2()
#
# print s.rob(root)



# 刘宇波的代码1
# 递归版
class Solution3(object):
def rob(self, root):
"""
:type root: TreeNode
:rtype: int
"""


return self.tryRob(root,True)


def tryRob(self,root,include):

if not root:
return 0



res = self.tryRob(root.left,True) + self.tryRob(root.right,True)

if include:
res = max(res,root.val + self.tryRob(root.left,False) + self.tryRob(root.right,False))



return res

# 刘宇波的代码2# 这个include 技巧用的好呀, 不同的递归函数用一个参数就合并了class Solution4(object): def rob(self, root): """ :type root: TreeNode :rtype: int """ self.memo = {} return self.tryRob(root,True) def tryRob(self,root,include): if not root: return 0 if self.memo.has_key(root): return self.memo[root] res = self.tryRob(root.left,True) + self.tryRob(root.right,True) if include: res = max(res,root.val + self.tryRob(root.left,False) + self.tryRob(root.right,False)) self.memo[root] = res return res# 刘宇波的代码3# 二元返回值分别代表包含该节点的最大值和不包含该节点的最大值class Solution5(object): def rob(self, root): """ :type root: TreeNode :rtype: int """ res = self.tryRob(root) return res[1] # res[0] 不包含root 的最大值 # res[1] 包含root 或者不包含 root 的最大值 def tryRob(self,root): if not root: return [0,0] resL = self.tryRob(root.left) resR = self.tryRob(root.right) res=[0,0] res[0] = resL[1] + resR[1] res[1] = max(res[0],root.val + resL[0] + resR[0]) return res

以上是关于动态规划_leetcode337的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 337. House Robber III 动态演示

动态规划_leetcode63

动态规划_leetcode312

动态规划_leetcode322

动态规划_leetcode213

leetcode-337-打家劫舍三*