读书人

问一路组合数学方面的题.

发布时间: 2012-10-17 10:25:47 作者: rapoo

问一道组合数学方面的题...
有n块木板,k种涂料,第i种涂料只有C(i)盒,每盒涂料可以刷一块木板,且Sum[C(i),{i, 1, k}] = n。现在用涂料刷满所有木板,且相邻的木板颜色不能相同,求有多少种方法。
输入:k,C(1),C(2)...C(k)
(不输入n,把C(1)到C(k)加起来就是n了,那个Sum表达式就是这个意思,求和符号打不出来)
输出:方法总数 mod 10^9的结果
范围:5 <= k <= 15, 1 <= Ci <= 5

样例:
3
1 2 3
输出
10




[解决办法]
u个A,v个B,w个C排成一排,相同字母不相邻,有多少种方法。
我以前研究过这个问题,见:http://bbs.bossh.net/home/u/wantnon/archives/2008/424.html
[解决办法]
感觉即使有公式,公式的长度也短不了,类似于整形规划里的泰勒展开,没想太清楚,感觉用动态规划有希望,
这题不需要每次都算到最后一步,利用一些同构和hash,算过的同构的就无需再次计算了,应该能够大幅度提高效率,
另外,对于C[i]中最大元素 > (N+1)/2时,应该有个无解的快速判断,当C[i]中最大元素 = N/2时,
应该可以用公式来算(N/2 + 1) * (N/2)! - M * (N/2 - 2)!

其中M为剩余元素中,满足C[i]>=2的元素个数

(这个公式是我大概齐想的一个,不知道是否正确,LZ用自己的程序也帮我验证一下吧!)

读书人网 >软件架构设计

热点推荐