洛谷 P4815 [CCO2014] 狼人游戏
首先题目中有 3 3 3 个限制:
- 没有机器人又被指控又被保护;
- 没有机器人被指控或保护一次以上;
- 如果有一个编号为 A A A 机器人指控或保护编号为 B B B 的机器人,那么我们保证 A < B A<B A<B。
那么我们把每一个机器人看成一个节点,每一个关系看成一条对应的边,由指控或保护者指向被指控或被保护者,那么结合前两个限制,容易发现,每一个点的入度只能为 0 0 0 或者 1 1 1,第三个限制保证了整个图没有环。那么整张图就变成了一个森林。
设 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k] 表示以 i i i 为根的子树,有 j j j 个狼人的方案数,其中 k = 0 k=0 k=0 表示节点 i i i 不是狼人, k = 1 k=1 k=1 表示节点 i i i 是狼人。那么一共只有 6 6 6 种对应的父子关系。
指控:
- 狼人父亲指控市民儿子
- 市民父亲指控市民儿子
- 市民父亲指控狼人儿子
保护:
- 狼人父亲保护狼人儿子
- 市民父亲保护市民儿子
- 市民父亲保护狼人儿子
这样的话我们可以列出转移方程,设 u u u 为父亲, v v v 为儿子。
当这条边是指控边时:
f [ u ] [ j ] [ 1 ] = f [ u ] [ j − k ] [ 1 ] × f [ v ] [ k ] [ 0 ] f[u][j][1] = f[u][j-k][1] \times f[v][k][0] f[u][j][1]=f[u][j−k][1]×f[v]