表示在 的子树里选 个节点的最优值,容量上限为 ,cur 是 目前已合并的节点数,sz[v] 是儿子 的子树大小。合并儿子 时写两层循环:
for (int j = min(cur, 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]);
这两处写法( 倒序、 的上界取 )各自要防的问题是( )。
- A. 两处都多余:合并的是不同子树,循环方向和上界都不影响结果
- B. 倒序只为减少运算次数, 只为让 的下标从 开始
- C. 倒序为防止 取到负数, 为防止 取到负数
- D. 倒序为使儿子 的贡献只被算一次(否则同一棵子树被选多次), 为防止 超出容量