贴一下我的,dfs每个节点返回一个arr arr[0]:自己可能被染的情况下,以自己为根的子树最多能染色多少个节点 arr[1]:自己一定不被染的情况下,以自己为根的子树最多能染色多少个节点 显然有个隐含条件是arr[0] >= arr[1](因为条件更宽松,所以可能染得肯定更多) 那么每个节点汇总信息的时候,自己一定不被染的情况就是各子树被染节点最多的情况的和,因为arr[0]>=arr[1],所以只加arr[0]就可以。 自己被染色,那最多只能和一个子节点一起被染,假设和子节点A一起染,最后的结果是(A[1] + 2)+ ∑(所有子节点 \ A)[0] 我们要找到子节点里能和自己构成完全平方数,且 A[1] + 2 - A[0] 最大的那个节点,遍历的时候记录最大值,最后累加到自己的[1]上就可以。即(A[1] + 2 - A[0] + ∑所有子节点[0] == A[1] + 2 + ∑(所有子节点 \ A)[0])