合法出栈顺序计数、卡特兰数公式详细推导

问题

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 是两个独立的子问题,故
f(n)=\sum\limits_{i=0}^{n-1}f(i)f(n-1-i)

i可以理解成k之前的个数,n-1-i理解成k之后的个数

第二种

合法出栈顺序数可以转化为求合法入栈出栈操作序列数,二者数量相同,因为:

  • 设A:合法入栈出栈操作序列;B:合法出栈顺序; f:A\rightarrow 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构成C_{2n}^{n}种序列,其中要么合法,要么不合法(存在位置,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的数量为C_{2n}^{n+1}

所以合法序列为数量为C_{2n}^{n}-C_{2n}^{n+1}

卡特兰数公式

对第二种结果化简

C_{2n}^{n}-C_{2n}^{n+1}

=\frac{2n!}{n!n!}-\frac{2n!}{n+1!n-1!}

=\frac{2n!}{n!n!}-\frac{2n!}{n!n!}*\frac{n}{n+1}

=\frac{2n!}{n!n!}*\frac{1}{n+1}

=\frac{1}{n+1}C_{2n}^{n}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值