前言

如果你对这篇文章可感兴趣,可以点击「【访客必读 – 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。

卡特兰数

一、基础公式

定义式

  • f[n]=∑i=0n−1f[i]∗f[n−1−i]f[n]=\sum\limits_{i=0}^{n-1}f[i]*f[n-1-i]f[n]=i=0n1f[i]f[n1i]

组合数公式 (用生成函数推导定义式)

  • f[n]=C2nn−C2nn−1f[n]=C_{2n}^n-C_{2n}^{n-1}f[n]=C2nnC2nn1
  • f[n]=C2nnn+1f[n]=\displaystyle\frac{C_{2n}^n}{n+1}f[n]=n+1C2nn
  • f[n]=4n−2n+1∗f[n−1]f[n]=\displaystyle\frac{4n-2}{n+1}*f[n-1]f[n]=n+14n2f[n1]

卡特兰数列

  • f[0]=1,f[1]=1,f[2]=2,f[3]=5…f[0]=1,f[1]=1,f[2]=2,f[3]=5…f[0]=1,f[1]=1,f[2]=2,f[3]=5...
  • 111,111,222,555,141414,424242,132132132,429429429,143014301430,486248624862,167961679616796,587865878658786,208012…208012…208012...

二、应用方向

括号匹配问题

  • nnn 个左括号,nnn 个右括号,对于每一个位置,左括号数大于等于右括号数的方案总数。
  • 等价于 nnn111nnn−1-11,每个位置前缀和大于等于 000 的方案总数。
  • 两种理解方向:
  1. f[n]=∑i=0n−1f[i]∗f[n−1−i]f[n]=\sum\limits_{i=0}^{n-1}f[i]*f[n-1-i]f[n]=i=0n1f[i]f[n1i]。枚举第一次前缀和为 000 的位置,假如第 2∗x2*x2x 个点为第一次前缀和为 000 的点,则固定第一个数为 111,第 xxx 个数为 −1-11,则对答案贡献为 f[x−1]∗f[n−x]f[x-1]*f[n-x]f[x1]f[nx]
  2. f[n]=C2nn−C2nn−1f[n]=C_{2n}^n-C_{2n}^{n-1}f[n]=C2nnC2nn1。总方案数为 C2nnC_{2n}^nC2nn,现需求不符合条件的方案数,将问题转化为网格上的折线问题。第 iii 次在 (i,j)(i,j)(i,j) 处,第 i+1i+1i+1 次在 (i+1,j+1)(i+1,j+1)(i+1,j+1)(i+1,j−1)(i+1,j-1)(i+1,j1) 处,终点为 (2n,0)(2n,0)(2n,0)。不符合条件则说明折线上出现了 (x,−1)(x,-1)(x,1) 这个点,xxx 为第一次到达 −1-11 的点,我们将 xxx 点之后的折线沿 y=−1y=-1y=1 对称过来,则终点为 (2n,−2)(2n,-2)(2n,2),则一共有 n−1n-1n1111n+1n+1n+1−1-11,即不合法的方案总数为 C2nn−1C_{2n}^{n-1}C2nn1,因此 f[n]=C2nn−C2nn−1f[n]=C_{2n}^n-C_{2n}^{n-1}f[n]=C2nnC2nn1
    卡特兰数详解-编程知识网

出栈次序问题

  • 一个无穷大的栈,进栈序列为 1,2,3…n1,2,3…n1,2,3...n,求有多少个不同的出栈序列。

多边划分为三角形问题

  • 将一个凸多边形区域分成三角形区域的方案数。
  • 在圆上选择 2∗n2*n2n 个点,将这些点对连接起来使得所得到的 nnn 条线段不想交的方案数。

二叉树计数问题

  • 给定 nnn 个节点,能构成多少种形状不同的二叉树。
  • 先取一个点作为顶点,然后左边依次可以取 0~n−10~n-10n1 个点,右边则可以取 n−1~0n-1~0n10 个点,相乘再累加即可得到答案。