树上最大匹配(选尽量多的边,任意两条没有公共端点)的 DP:
for (int v : ch[u]) sum += max(f0[v], f1[v]); // 第一遍
f0[u] = sum;
f1[u] = -INF;
for (int v : ch[u]) // 第二遍
f1[u] = max(f1[u], sum - max(f0[v], f1[v]) + f0[v] + 1);
其中 表示「u 已经和某个孩子配了对」时的最大匹配数。第二遍循环里 sum - max(f0[v], f1[v]) + f0[v] + 1 的含义是( )。
- A. 取所有孩子里 最大的那个,再加 1
- B. 把「u 与 v 配对」的那条边 1 直接加到
sum上,其余不变 - C. 把 v 的贡献换成 (因为 v 被配对后可以继续和它的孩子配)
- D. 先撤掉 v 原来的贡献 、换成 (v 和 u 配对后不能再和自己的孩子的配对),再加上这条边 1