【力扣roadmap】LCP 34. 二叉树染色

24 阅读1分钟

题目描述

  • 竞赛积分2124
  • 题号968

image.png

思路

题目关键在于“每个蓝色相连部分个数不超过k个”,意味着(起码是我认为最好是)从下向上遍历,而且每个节点必须保存“以当前节点为根节点,已经染了几个节点且每种情况的总价值“。

我们为每一个结点定义一个数组dp,其长度为(k+1)。

  • dp[0] 表示当前节点不染色,显然,此时dp[0]的价值应该为 ”左子树任何合法染色方案的最大价值 + 右子树任何合法染色方法的最大价值“。
  • dp[i]表示当前染色,且算上当前节点,已经染色了i个节点了,其中左子树染色了j个节点,右子树染色了i-1-j个结点,dp[i]取这些合法染色情况中最大价值。

代码

class Solution:
    def maxValue(self, root: TreeNode, k: int) -> int:
        def dfs(node) :
            dp = [0] * (k+1)
            if not node : 
                return dp
            left = dfs(node.left)
            right = dfs(node.right)
            dp[0] = max(left) + max(right)
            for i in range(1,k+1) :
                dp[i] = max(left[j] + right[i-j-1] for j in range(i))  + node.val
            return dp 
        return max(dfs(root))