‹ 上一题 下一题 ›

g7-07708. 树形背包的复杂度 未做

表示在 的子树里选 个节点的最优值,容量上限 。合并儿子的代码如下:

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. 因为树只有 条边,是稀疏图,所以复杂度与边数同阶,是
未选择
输入
输出

            
答案