LCP 34. 二叉树染色

class Solution:
    def maxValue(self, root: TreeNode, k: int) -> int:

        def dfs(root):
            # 空节点价值全为0
            res = [0]*(k+1)
            if not root:
                return res
            
            # 递归获取左右节点的状态
            left = dfs(root.left)
            right = dfs(root.right)
            # 按照转移公式进行计算
            res[0] = max(left) + max(right)
            for i in range(k):
                for j in range(k-i):
                    if left[i]+right[j]+root.val > res[i+j+1]:
                        res[i+j+1] = left[i]+right[j]+root.val
            return res

        return max(dfs(root))

树形DP

小扣有一个根结点为 root 的二叉树模型,初始所有结点均为白色,可以用蓝色染料给模型结点染色,模型的每个结点有一个 val 价值。小扣出于美观考虑,希望最后二叉树上每个蓝色相连部分的结点个数不能超过 k 个,求所有染成蓝色的结点价值总和最大是多少?

示例 1:

输入:root = [5,2,3,4], k = 2

输出:12

解释:结点 5、3、4 染成蓝色,获得最大的价值 5+3+4=12


示例 2:

输入:root = [4,1,3,9,null,null,2], k = 2

输出:16

解释:结点 4、3、9 染成蓝色,获得最大的价值 4+3+9=16


提示:

1 <= k <= 10
1 <= val <= 10000
1 <= 结点数量 <= 10000

posted @ 2022-08-11 14:05  meetviolet  Views(54)  Comments(0Edit  收藏  举报