第九周作业(周三)
这节课老师讲了 Functional Programming ,我翻了几道题发现都用不着这个……
Leetcode 124
求二叉树上最大的路径和。这里注意路径至少有一个点。
解法显然,树形dp。每个点维护两个值:这颗子树中最大的路径和 f(x)f(x)、从这个点往下走能走到的最大路径和 g(x)g(x) 。
就有:
f(x)=max(f(lson(x)),f(rson(x)),g(lson(x))+g(rson(x))+val(x))f(x)=max(f(lson(x)),f(rson(x)),g(lson(x))+g(rson(x))+val(x))
g(x)=max(g(lson(x)),g(rson(x)))+val(x)g(x)=max(g(lson(x)),g(rson(x)))+val(x)
非常讨厌的是,路径至少要有一个点……边界条件超级容易判错……WA了几发才过……
class Solution:
def MPS_MLS(self, root):
if root == None:
return -1000000000, 0
lmps, lmls = self.MPS_MLS(root.left)
rmps, rmls = self.MPS_MLS(root.right)
return max(max(lmps, rmps), lmls + root.val + rmls), max(max(lmls, rmls) + root.val, 0)
def maxPathSum(self, root):
"""
:type root: TreeNode
:rtype: int
"""
a, b = self.MPS_MLS(root)
return a