出栈序列计数问题
给定一长为n的序列,各位元素各不相同,那么经过入栈,出栈后,可以得到多少种不同的序列。
这个问题的答案是卡特兰数C(n)。
卡特兰数
卡塔兰数是中一个常在各种计数问题中出现的数列。用C(n)表示卡特兰数第n项,则有通项公式
[C(n)=C_{2n}^n-C_{2n}^{n+1}=frac{C_{2n}^n}{n+1}=frac{(2n)!}{(n+1)!n!}
]
有递推公式
[C(0)=1 qquad andqquad C(n+1)=frac{2(2n+1)}{n+2}C(n)
]
证明
长为n的序列,每个元素需要入栈一次,出栈一次,以0表示入栈,1表示出栈。则出入栈操作可以由一个长为2n的01串唯一表示。这个01串需符合以下条件:
-
其中0与1的数量均为n。
-
对于任意位置i,[1,i]位置的子串中,出现的1的个数不大于0的个数(栈的性质,未入栈不可出栈)。
可以用容斥原理统计符合条件的01串。
首先易得符合条件1的01串个数为C(2n,n)。
其中不符合条件2的串一定有: 对于某个位置2i+1,[1,2i+1]出现的1的个数为i+1,0的个数为i。
又此串符合条件1,那么剩余位置的0,1个数分别为n-i,n-i-1。
如果将剩余位置的1变为0,0变为1。那么这个串就变成了一个由n-1个0,n+1个1组成的串。
设符合条件1但不符合条件2的串构成集合N,由n-1个0,n+1个1组成的01串构成集合M
由于01互换操作是一个一一映射函数,故M与N之间存在一个一一映射,故M,N元素个数相等(映射的性质)。
故卡特兰数的通项公式为C(2n,n)-C(2n,n+1)。
这种思想称为映射计数法。
一些可以用卡特兰数的问题
-
从(0,0)到(n,n)的不越过直线y=x的非降路径数
-
含n个节点的不同构的二叉树的数量
-
凸n+2边形分割为n个三角形的方法数
-
n对括号排列组成的合法的括号序列个数