BZOJ4498 魔法的碰撞 题解
题意
在 \(m\) 个格子放 \(n\) 个人,要求与第 \(i\) 个人距离 \(a_i\) 之内的地方没有人,求方案数。
\(1\le m\le10^5,1\le n,a_i\le40\)
题解
考虑枚举排列,那么第 \(i\) 个人和第 \(i+1\) 个人之间要 \(d_i=\max(a_i,a_{i+1})\) 个格子隔开。
所以在这个排列下有 \(\binom{m-\sum d_i}{n}\) 种方案。
但显然不能直接枚举排列的。考虑距离的值域很小所以来 DP 算,只需要算出 \(d_i\) 之和。
如果把 \(a_i\) 从大到小排序来放,这样的话每次可以直接计算对 \(\sum d_i\) 的贡献。
设 \(\operatorname{f}(i,j,k)\) 为从大到小放了 \(i\) 个,给剩下的数留了 \(j\) 个位置(如果之后要在这个数旁边放数,放几个就会对 \(k\) 产生 \(a_i\) 贡献), \(\sum d_i=k\) 的方案数。
所以转移为: \(\operatorname{f}(i,j,k)=(j+1)\operatorname{f}(i-1,j+1,k)+2j\operatorname{f}(i-1,j,k-a_i)+(j-1)\operatorname{f}(i-1,j-1,k-2a_i)\)
最后对每个 \(k\) 算贡献。
时间复杂度: \(O(n^2\sum a_i)\) 。
口胡的没写代码。

浙公网安备 33010602011771号