表示在 的子树里选 个节点的最优值,容量上限 。合并儿子的代码如下:
void dfs(int u, int fa) {
dp[u][0] = 0; sz[u] = 1;
for (int v : adj[u]) {
if (v == fa) continue;
dfs(v, u);
for (int j = min(sz[u], K); j >= 0; j--)
for (int k = 0; k <= min(sz[v], K - j); k++)
dp[u][j + k] = max(dp[u][j + k], dp[u][j] + dp[v][k]);
sz[u] += sz[v];
}
}
单看嵌套的层数,每个节点都有一层 、一层 ,合起来像是 。它实际是 的原因是( )。
- A. 因为 的上界被 限制,三层循环的实际次数约为 ,只是常数变小了
- B. 因为每一对节点只会在它们的 LCA 处被合并一次,总配对数不超过 ,所以是
- C. 因为每个状态只被访问一次,三层循环的循环体总共只执行 次
- D. 因为树只有 条边,是稀疏图,所以复杂度与边数同阶,是