洛谷 P3349
给定一个有 \(n\) 个节点的树和一个有 \(n\) 个节点 \(m\) 条边的图。
问有多少个对应关系 \(p\) 满足:
- \(p\) 是排列。
- 若 \((u, v)\) 这条边在树上,则 \((p_u, p_v)\) 在图上。
\(n \le 17\)
如果直接考虑状压 DP 的话,因为要合并子树,怎么做都需要一个 \(3^n\),还需要记录子树根节点是啥,时间复杂度是 \(O(n^33^n)\),TLE。
接下的做法十分神奇,没做过几乎想不出来。
换个视角:\(p\) 是排列等价于所有 \(i\) 都在 \(p\) 中出现过。这玩意看起来就很能容斥。
具体地我们考虑一个 \(\{1, 2, \dots , n\}\) 的子集 \(S\),\(p_i\) 只能是 \(S\) 中的元素,令 \(dp_{u, i}\) 表示 \(p_u = i\) 时 \(u\) 子树内的方案数。那么转移时是:
\[dp_{u, i} = \prod\limits_{v \in son_u} (\sum\limits_{(i, j) \in E} dp_{v, j})
\]
\(i, j\) 只能是 \(S\) 内的元素,\(S\) 的贡献是 \((-1)^{n - |S|} \sum dp_{1, i}\)。
时间复杂度:\(O(n^32^n)\)。
这个题巧妙地转换了一下角度,DP 不记录用过了哪些数,而是通过 容斥 钦定只能使用那些数,从而避免合并子树,做到 \(O(n^32^n)\) 的复杂度。
似乎容斥时的 DP 值可能炸 因为答案是在 long long 但是这个题没卡。long long 范围内的,可以使用 ull。
浙公网安备 33010602011771号