PeacefulTeams

[ABC310D] Peaceful Teams

考虑状压 DP。

\(f[i][S'][S]\) 表示已经分配到了第 \(i\) 组,且该组的人集合为 \(S'\),分配过的人集合为 \(S\) 方案数。

假设加入一个人\(j\),则 \(f[i][S'][S]->f[i][S'|j][S|j]\)(当然需要满足一定条件)

或者加入之后新分了一组,则 \(f[i][S'][S]->f[i+1][j][S|j]\)(当然需要满足一定条件)

状态中的 \(j\) 注意转换成二进制的幂次。

答案为 \(f[n][any][all]\),其中 \(any\) 满足不为 \(0\)\(all\) 为所有人都分配,即 \(2^n-1\)

注意需要最后除以排列总数 \(t!\),还需保证每组内编号上升(跨组任意),不然会算重。

初始状态 \(f[0][0][0]=1\)

复杂度 \(O(tn4^n)\)

AC

posted @ 2023-07-20 15:29  wscqwq  阅读(14)  评论(0编辑  收藏  举报