卡特兰数,栈的特殊运用

本文探讨了卡特兰数,一种在组合数学中常见的数列,涉及递推公式、组合公式以及其在进出栈问题、货币找零等实际场景的应用。通过公式推导和代码示例,揭示了卡特兰数的计算方法及其在解决数学和计算机科学问题中的重要作用。
摘要由CSDN通过智能技术生成

简介

卡特兰数是一个在组合数学里经常出现的一个数列,对卡特兰数来说,难以抽象出一个具体的意义预知对应,但它却是一个十分常见的数学规律,符合多种问题规律求解。从零开始,卡特兰数的前几项为1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790…

递推公式

  • 基础公式:

C n + 1 = C 0 C n + C 1 C n − 1 + . . . + C n − 1 C 1 + C n C 0 C 0 = C 1 = 1 C_{n+1}=C_0C_n+C_1C_{n-1}+...+C_{n-1}C_1+C_nC_0\\C_0=C_1=1 Cn+1=C0Cn+C1Cn1+...+Cn1C1+CnC0C0=C1=1

或者:​​

C n + 1 = { ∑ i = 0 n C i C n − i , n > 1 1 , n = 0 , 1 } C_{n+1}=\left\{ \begin{aligned} &\sum_{i=0}^nC_iC_{n-i},&n>1 \\ &1,&n=0,1 \end{aligned} \right\} Cn+1=i=0nCiCni,1,n>1n=0,1

其中C表示Catalan数。

  • 组合公式

C a t a l a n n = C 2 n n − C 2 n n + 1 = ( 2 n ) ! n ! ∗ n ! − ( 2 n ) ! ( n + 1 ) ! ∗ ( n − 1 ) ! = 1 n + 1 ( ( 2 n ) ! ∗ ( n + 1 ) n ! ∗ n ! − ( 2 n ) ! n ! ∗ ( n − 1 ) ! ) = 1 n + 1 ( ( 2 n ) ! ∗ ( n + 1 ) n ! ∗ n ! − ( 2 n ) ! ∗ n n ! ∗ n ! ) = 1 n + 1 ∗ ( 2 n ) ! ∗ ( n + 1 ) − ( 2 n ) ! ∗ n n ! ∗ n ! = 1 n + 1 ∗ ( 2 n ) ! n ! ∗ n ! = 1 n + 1 C 2 n n \begin{aligned} Catalan_n&=C_{2n}^n-C_{2n}^{n+1}\\ &=\frac{(2n)!}{n!∗n!}−\frac{(2n)!}{(n+1)!∗(n−1)!}\\ &=\frac1{n+1}(\frac{(2n)!∗(n+1)}{n!∗n!}−\frac{(2n)!}{n!∗(n−1)!})\\ &=\frac1{n+1}(\frac{(2n)!∗(n+1)}{n!∗n!}−\frac{(2n)!∗n}{n!∗n!})\\ &=\frac1{n+1}∗\frac{(2n)!∗(n+1)−(2n)!∗n}{n!∗n!}\\ &=\frac1{n+1}∗\frac{(2n)!}{n!∗n!}\\ &=\frac1{n+1}C_{2n}^n \end{aligned} Catalann=C2nnC2nn+1=n!n!(2n)!(n+1)!(n1)!(2n)!=n+11(n!n!(2n)!(n+1)n!(n1)!(2n)!)=n+11(n!n!(2n)!(n+1)n!n!(2n)!n)=n+11n!n!(2n)!(n+1)(2n)!n=n+11n!n!(2n)!=n+11C2nn

或者:
C a t a l a n n = 4 n + 2 n + 2 C a t a l a n n Catalan_n=\frac{4n+2}{n+2}Catalan_n Catalann=n+24n+2Catalann
推导如下:
C a t a l a n n + 1 = 1 n + 2 C 2 n + 2 n + 1 1 n + 2 ∗ ( 2 n + 2 ) ! ( n + 1 ) ! ∗ ( n + 1 ) ! 1 n + 2 ∗ ( 2 n ) ! ∗ ( 2 n + 1 ) ∗ ( 2 n + 2 ) n ! ∗ n ! ∗ ( n + 1 ) 2 1 n + 2 ∗ ( 2 n + 1 ) ∗ ( 2 n + 2 ) ( n + 1 ) ∗ 1 n + 1 ∗ ( 2 n ) ! n ∗ n ! 2 ( 2 n + 1 ) n + 2 ∗ 1 n + 1 ∗ C 2 n n 4 n + 2 n + 2 C a t a l a n n \begin{aligned} Catalan_{n+1}&=\frac1{n+2}C_{2n+2}^{n+1}\\ &\frac1{n+2}∗\frac{(2n+2)!}{(n+1)!∗(n+1)!}\\ &\frac1{n+2}∗\frac{(2n)!∗(2n+1)∗(2n+2)}{n!∗n!∗(n+1)^2}\\ &\frac1{n+2}∗\frac{(2n+1)∗(2n+2)}{(n+1)}∗\frac1{n+1}∗\frac{(2n)!}{n∗n!}\\ &\frac{2(2n+1)}{n+2}∗\frac1{n+1}∗C_{2n}^n\\ &\frac{4n+2}{n+2}Catalan_n \end{aligned} Catalann+1=n+21C2n+2n+1n+21(n+1)!(n+1)!(2n+2)!n+21n!n!(n+1)2(2n)!(2n+1)(2n+2)n+21(n+1)(2n+1)(2n+2)n+11nn!(2n)!n+22(2n+1)n+11C2nnn+24n+2Catalann

其中的C代表组合数标记

应用

  1. 进出栈问题。将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的 push 操作);将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的 pop 操作),使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,不同的输出序列数有多少种?
  2. 有2n个人排成一行进入剧场。入场费 5 元。其中只有n个人有一张 5 元钞票,另外n人只有 10 元钞票,剧院无其它钞票,问有多少中方法使得只要有 10 元的人买票,售票处就有 5 元的钞票找零?
  3. 一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果他从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
  4. 在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
  5. 对角线不相交的情况下,将一个凸多边形区域分成三角形区域的方法数?
  6. n个结点可构造多少个不同的二叉树?

典型进出栈解法

序列1,2,3,4…n入栈在出栈,考虑n出栈时的位置,可将栈分为在其前面出栈和在其后面出栈两部分,以 C n C_n Cn代表序列长度为n时的不同输出序列的数量。若n为第一个出栈的数,其前面有 C 0 C_0 C0种输出方式,其后有 C n − 1 C_{n-1} Cn1种输出方式,n第一个出栈的排列总数为 C 0 C n − 1 C_0C_{n-1} C0Cn1;若考虑n第k个数出栈,在其前面出栈的数有 C k − 1 C_{k-1} Ck1​种出栈方式,在其后面出栈的数有 C n − k + 1 C_{n-k+1} Cnk+1种出栈方式,此状态下的输出的总排列数量为 C k − 1 C n − k + 1 C_{k-1}C_{n-k+1} Ck1Cnk+1​; C n C_n Cn​为n在输出序列中不同位置时的所有不同排列数的加和:

C n + 1 = C 0 C n + C 1 C n − 1 + . . . + C n − 1 C 1 + C n C 0 C_{n+1}=C_0C_n+C_1C_{n-1}+...+C_{n-1}C_1+C_nC_0 Cn+1=C0Cn+C1Cn1+...+Cn1C1+CnC0

image-20211128191823776

  • 通式解法
n=int(input())
catalan = [0]*(n+1)
if n<=1:
    print(1)
else:
    catalan[0]=1
    catalan[1] = 1
    for i in range(2,n+1):
        catalan[i] = sum([catalan[j]*catalan[i-j-1] for j in range(i)])

    print(catalan[n])
  • 变形公式解法
n=int(input())
c = 1
for i in range(1,n+1):
    c *= (4*(i-1)+2)/(i+1)

print(int(c))
n=int(input())
c = 1
for i in range(1,n+1):
    c *= (4*(i-1)+2)/(i+1)

print(int(c))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值