题目描述
有n种颜色, 每种颜色
n,ai≤50,∑ni=1ai≤1500
思路
首先根据先组合,后排列的原则,我们只要求出元素间无差别的方案数,将它乘上∏ni=1ai!就可以了。
接下来,可以使用插空法的思路。
然而这里因为存在多组不能相邻的元素,也就是说,这一组在插入的时候可以暂时存在相邻的元素。
我们设状态fi,j表示前i−1组元素排列好后,还有j个空隙是不合法的方案数。
那么对当前插入的一堆元素,记数量为
首先要将它分拆k组,
而我们将它分拆成k组以后,可能会导致新的非法空隙产生,具体数量是
那么这k组我们又可以分配若干组去消除一些原来的非法空隙,不妨枚举消除了
那么我们从中选出l个的方案数是
从其余的空位中选出k−l个的方案数是(∑i−1x=1ai+1−jk−l)
那么新状态的不合法空隙数应该是j′=j−l+(ai−k)个
于是递推方程就很显然了
(ai−1k−1)(kl)(∑i−1x=1ai+1−jk−l)fi,j→fi+1,j−l+(ai−k)
枚举k和
时间复杂度:O((∑ni=1ai)a2i)
空间复杂度:O(∑ni=1ai)

探讨了在多种颜色元素中,如何通过插空法实现颜色相同元素不相邻的排列问题。采用组合与排列原则,利用递推方程计算排列数。
1928

被折叠的 条评论
为什么被折叠?



