• 卡特兰数(Catalan number)


    卡特兰数

    定义

    C n = ( 2 n n ) n + 1 = ( 2 n ) ! ( n + 1 ) ! n ! = ∏ k = 2 n n + k k = ∑ i = 0 n − 1 C i C n − i = 2 ( 2 n − 1 ) n + 1 C n − 1 = ( 2 n n ) − ( 2 n n − 1 ) C_n=\frac{

    (2nn)" role="presentation" style="position: relative;">(2nn)
    }{n+1}=\frac{(2n)!}{(n+1)!n!}=\prod_{k=2}^{n}\frac{n+k}{k}=\sum_{i=0}^{n-1}C_iC_{n-i}=\frac{2(2n-1)}{n+1}C_{n-1}=
    (2nn)" role="presentation" style="position: relative;">(2nn)
    -
    (2nn1)" role="presentation" style="position: relative;">(2nn1)
    Cn=n+1(2nn)=(n+1)!n!(2n)!=k=2nkn+k=i=0n1CiCni=n+12(2n1)Cn1=(2nn)(2nn1)

    推导

    考虑 n × n n\times n n×n的网格,只能向上或者向右走,且不能超过 y = x y=x y=x这条对角线
    问:从 ( 0 , 0 ) (0,0) (0,0)走到 ( n , n ) (n,n) (n,n)有多少种走法

    解:从 ( 0 , 0 ) (0,0) (0,0)走到 ( n , n ) (n,n) (n,n)的方案数需要向右走 n n n次和向上走 n n n
    其实就是说每一步,向右次数必须要大于等于向上走的次数

    如果不考虑对角线这个限制,总共有 ( 2 n n )

    (2nn)" role="presentation" style="position: relative;">(2nn)
    (2nn)总走法

    接着考虑不合法的走法
    不合法也就意味着经过了 y = x + 1 y=x+1 y=x+1这一条直线
    设第一次在 P P P点接触到 y = x + 1 y=x+1 y=x+1
    此时向上走的次数比向右走的次数多1
    也就是说从 P P P点到 ( n , n ) (n,n) (n,n),向右走的次数会比向左走的次数多1
    P P P点到 ( n , n ) (n,n) (n,n)的路径中,向右和向上对调(即沿着 y = x y=x y=x翻转)
    那么最后将会到达 ( n − 1 , n ) (n-1,n) (n1,n)

    也就是说所有的不合法的路径,经过这个操作都会到达 ( n − 1 , n ) (n-1,n) (n1,n)
    因为这个翻转操作是可逆的,所以不合法路径和到达 ( n − 1 , n ) (n-1,n) (n1,n)的路径构成一个双射

    那么合法的数量就是 ( 2 n n ) − ( 2 n n − 1 )

    (2nn)" role="presentation" style="position: relative;">(2nn)
    -
    (2nn1)" role="presentation" style="position: relative;">(2nn1)
    (2nn)(2nn1)
    在这里插入图片描述
    (图来自wiki,红色虚的折线是不合法路径,红色实的折线是翻转后)

    还有一种推导方法
    因为向右次数必须要大于等于向上走的次数
    所以设向右走为 ( x ′ , y ′ ) = ( x + 1 , y + 1 ) (x',y')=(x+1,y+1) (x,y)=(x+1,y+1)
    所以设向上走为 ( x ′ , y ′ ) = ( x + 1 , y − 1 ) (x',y')=(x+1,y-1) (x,y)=(x+1,y1)
    最终目标是走到 ( 2 n , 0 ) (2n,0) (2n,0)
    限制就是不能走到 y = − 1 y=-1 y=1,然后推导思路和上面一样

    这种推导方法的有点是,假设不是到达 ( n , n ) (n,n) (n,n),而是 ( n , m ) (n,m) (n,m)也可以类似地分析出来

    例子

    括号匹配

    给定n对括号,求括号正确配对的字符串数
    例如:
    n=0:空串,1种
    n=1:(),1种
    n=2: (()) ()(),2种
    n=3:((())) ()(()) ()()() (())() (()()),5种
    解:
    观察最后一对括号,可以分为最后一对括号中括号匹配数和最后一对括号前的匹配数,然后相乘
    f ( n ) f(n) f(n)为给定n对括号,括号正确配对的字符串数
    f ( n ) = ∑ i = 0 n − 1 f ( i ) f ( n − i ) f(n)=\sum_{i=0}^{n-1}f(i)f(n-i) f(n)=i=0n1f(i)f(ni)

    也可以像推导种那样,向右次数必须要大于等于向上走的次数,这里每一个位置的左括号数必须大于右括号数
    进而 f ( n ) = ( 2 n n ) − ( 2 n n − 1 ) f(n)=

    (2nn)" role="presentation" style="position: relative;">(2nn)
    -
    (2nn1)" role="presentation" style="position: relative;">(2nn1)
    f(n)=(2nn)(2nn1)

    出栈序列

    1 , 2 , ⋯   , n 1,2,\cdots, n 1,2,,n按顺序入栈(栈无限大),问出栈序列有多少种
    解:
    考虑 k k k最后一个出栈,

    • 那么 1 , 2 , ⋯   , k − 1 1,2,\cdots,k-1 1,2,,k1需要先出栈
    • 然后 k + 1 , ⋯   , n k+1,\cdots, n k+1,,n出栈
    • 最后 k k k出栈

    f ( n ) f(n) f(n)为出栈序列数量
    f ( n ) = ∑ i = 0 n − 1 f ( i ) f ( n − i ) f(n)=\sum_{i=0}^{n-1}f(i)f(n-i) f(n)=i=0n1f(i)f(ni)

    二叉搜索树

    n个数组成一棵二叉搜索树,问方案数
    解:
    设k为根,则 1 , 2 , ⋯   , k − 1 1,2,\cdots,k-1 1,2,,k1为左子树, k + 1 , ⋯   , n k+1,\cdots,n k+1,,n为右子树
    f ( n ) f(n) f(n)为n个数组成一棵二叉搜索树的方案数
    f ( n ) = ∑ i = 0 n − 1 f ( i ) f ( n − i ) f(n)=\sum_{i=0}^{n-1}f(i)f(n-i) f(n)=i=0n1f(i)f(ni)

  • 相关阅读:
    ModStartCMS v5.3.0 任务调度记录,模块市场优化
    lvs的keepalived
    Java String.indexOf()方法具有什么功能呢?
    【译】我为 .NET 开发人员准备的 2023 年 Visual Studio 10 大新功能
    SpringBoot实现多数据源(五)【多数据源事务控制】
    【软件测试】理论知识基础第三章
    复盘:什么是秋招提前批?什么是普通秋招?都是招聘,为啥要设置这两个招聘时间段
    详解联邦学习中的异构模型集成与协同训练技术
    【网络豆送书第五期】Kali Linux高级渗透测试
    控制输入流,从控制台打印到文件中,更改输出的位置
  • 原文地址:https://blog.csdn.net/qq_39942341/article/details/126073269