问题
n个数1,2,...,n按顺序入栈,中途允许出栈,问合法的出栈顺序有多少种?(该问题的结果为卡特兰数)
思路
第一种
按照出栈序列的末尾k分类,如果k最后一个出栈,说明:
-
已知1到k-1比k先入栈,由于栈的后进先出特性,它们必须在k入栈前出栈,否则它们会在k之后出栈。
-
k+1到n出栈在k出栈之前
所以总体顺序为1 ~ k-1入、出栈 -> k入栈 -> k+1 ~ n入、出栈 -> k出栈。注意到1 ~ k-1入、出栈 和 k+1 ~ n 是两个独立的子问题,故
i可以理解成k之前的个数,n-1-i理解成k之后的个数
第二种
合法出栈顺序数可以转化为求合法入栈出栈操作序列数,二者数量相同,因为:
-
设A:合法入栈出栈操作序列;B:合法出栈顺序;
, f(a)=a对应的出栈序列
-
显然,每一个出栈顺序都有相应的入栈出栈操作序列,所以f为满射
-
出栈序列相同当且仅当入栈出栈操作顺序相同,所以f为单射
-
不妨假设在两个出栈序列第一个不同的位置,a1使得p入栈,a2使得q出栈。此时a1栈中q在p下方,q比p后出栈;而a2中p还未入栈q就出栈,q比p先出栈,故出栈序列必然不同。
-
-
所以,f为双射,AB集合元素数量相同。
那么现在要求合法入栈出栈操作序列的数量。
-
设入栈为0,出栈为1,合法的序列应该有n个0,n个1,并且在任意位置,其前面0和1的个数,count0>=count1。
-
n个0,n个1构成
种序列,其中要么合法,要么不合法(存在位置,count0<count1),那么总数减去不合法就可以求得合法的序列数量
-
考虑不合法的情况
-
设其第一个count0<count1的位置为k,k之前0和1数量相同,k是1,k后面0比1多1。如果将其后面反转,则生成的新序列有n+1和1和n-1个0。所以我们会考虑不合法的数量是否恰好等于n+1个1和n-1和0构成的序列的数量:
-
设A:n个0,n个1构成的不合法序列;B:n+1个1和n-1个0构成的序列。则刚才的转化表示,存在A到B的映射,故B的数量小于等于A。
-
考虑n+1个1、n-1个0构成的序列,由于1比0多,所以存在位置使得count0<count1,在第一个这样的位置做相同的变换,会生成n个0,n个1构成的序列。即存在B到A的映射,故A的数量小于等于B。
-
二者结合,A与B数量相同,B的数量为
-
所以合法序列为数量为
卡特兰数公式
对第二种结果化简