题目描述
竞赛积分2124题号968
思路
题目关键在于“每个蓝色相连部分个数不超过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))