关于Catalan数的解释网上已经有很多了,这里写一下一个常用的Catalan数模型
出自《组合数学》:有n 个1和n个-1 ,求有多少个排列使得对任意前k个数,和>=0
分析:对于任意前k个数和>=0,这不好求,所以应该转化为反面问题:求有多少个排列使得存在1~k的一段和<0(我们称之为不合法排列)
考虑一个不合法序列,对于最小的K,使得存在1~k的一段和<0,就一定有1~k-1的和=0,Ak=-1;
那么考虑翻转前k个数,就得到了一个有n+1个1,n-1个-1的序列;
同时从反面说,对于每一个有n+1个1,n-1个-1的序列,都一定可以通过翻转前若干个数的到一个不合法排列。
以上两点说明翻转后的序列和我们要求的不合法序列是一一对应的
那么问题就转化为了求有n+1个1,n-1个-1的序列的个数。显然答案为(2n)/(n+1)!/(n-1)!
那么原问题就是总排列数-不合法序列数=(2n)!/n!/n!-(2n)/(n+1)!/(n-1)!
化简正好是Catalan数。
考虑一个变形,有n个1和m个-1时,怎么做?
思路和刚才一样。翻转后我们可以得到有n+1个1,m-1个-1的序列。
每一个不合法序列对应一个有n+1个1,m-1个-1的序列,每一个有n+1个1,m-1个-1的序列都代表一个不合法序列。
同样的,每一个含有n+1个1,m-1个-1的序列和一个不合法序列一一对应
那么根据刚才的推导过程,最终答案为(m+n)!/m!/n!-(m+n)/(n+1)!/(m-1)!
这就是 SCOI 2010 字符串 的解法。
只不过原题是1和0,要求1的数量>=0的数量,和这个是一样的。
同时,这个模型还可以转化成很多问题。+1和-1可以代表很多东西。
比如括号匹配:(和)对应+1和-1;
单调路径,→对应+1,↑对应-1;
还有著名的排队买票问题:有2n个人排成一行进入剧场。入场费5元每人。但现在2n个人中,n个人持有5元,n个人持有10元,且售票处开始时没有钱。问有多少种排队方式使得每个人都保证有钱找(或者不用找)?
把持有10元的人看做+1;5元的-1