题解| 小美的树上染色 整体思路 先定义一个概念【叶子】节点:该节点为白色节点,有且只有一个相邻节点可以一起涂成红色。若某个白色节点A存在多个相邻节点,但其中只有一个相邻的白色节点,满足双方权值的乘积是完全平方数,那么节点A也是叶子节点。 本题有一个关键的说明,也就是第一句话:小美拿到了一棵树。既然是...
小美的树上染色题解 题目:小美拿到了一棵树,每个节点有一个权值。初始每个节点都是白色。 小美有若干次操作,每次操作可以选择两个相邻的节点,如果它们都是白色且权值的乘积是完全平方数,小美就可以把这两个节点同时染红。小美想知道,自己最多可以染红多少个节点? 思路:由于只在乎相邻节点权值乘积为完全平方数的,所...
小美拿到了一棵树,每个节点有一个权值。初始每个节点都是白色。小美有若干次操作,每次操作可以选择两个相邻的节点,如果它们都是白色且权值的乘积是完全平方数,小美就可以把这两个节点同时染红。小美想知道,自己最多可以染红多少个节点? 输入描述:第一行输入一个正整数n,代表节点的数量。 第二行输入n个正整数ai,...
2、dp[i][0] 表示以节点i为子树根节点时,节点i没有被染色时整个i节点子树可以被染色的最多节点数量;同样 dp[i][1] 表示以节点i为子树根节点时,节点i被染色时整个i节点子树可以被染色的最多节点数量; 3、dp[i][0] 为i节点的所有下级子节点j的最大值总和,为 dp[i][0]=∑max(dp[j][0],dp[j]...
小美的树上染色 这是题面 思路 题目的限制条件有两个 节点需要是相邻的 都还没被访问过并且乘积是一个完全平方数 然后求最多能访问多少个节点 如果从根开始考虑的话,可能不是很好想,因为跟可能有很多儿子,和哪个儿子结合呢?好像不好想 那我们可以试着从叶子节点开始考虑,因为叶子节点能够结合的只有它们的父亲 ...
题解| 小美的树上染色 def solve(): # Read input n = int(input()) # Node values, 1-indexed w = [0] + list(map(int, input().split())) # Create adjacency list representation of the tree g = [[] for _ in range(n + 1)] for _ in range(n - 1): u, v = map(int, ...
题解| 小美的树上染色 def solve(): # Read input n = int(input()) # Node values, 1-indexed w = [0] + list(map(int, input().split())) # Create adjacency list representation of the tree g = [[] for _ in range(n + 1)] for _ in range(n - 1): u, v = map(int, ...
dp[i][0/1]表示第i个结点染色不染色/染色的最大的染色数量。 那么对于dp[i][0]来说就是它的子节点的染色最大树量的和,dp[i][1]则需要再来一轮循环,统计某个子节点与父节点一起染色的最大值。 #include <bits/stdc++.h> using namespace std; ...