引言

在开始论述之前,我想请大家先看下这几个问题:

  1. 有 \(2n\) 个人排成一行进入剧场。入场费 5 元。其中只有 \(n\) 个人有一张 5 元钞票,另外 \(n\) 人只有 10 元钞票,剧院无其它钞票,问有多少中方法使得只要有 10 元的人买票,售票处就有 5 元的钞票找零?
  2. 一位大城市的律师在她住所以北 \(n\) 个街区和以东 \(n\) 个街区处工作。每天她走 \(2n\) 个街区去上班。如果他从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
  3. 在圆上选择 \(2n\) 个点,将这些点成对连接起来使得所得到的 \(n\) 条线段不相交的方法数?
  4. 对角线不相交的情况下,将一个凸多边形区域分成三角形区域的方法数?
  5. 一个栈(无穷大)的进栈序列为 \(1,2,3, \cdots ,n\) 有多少个不同的出栈序列?
  6. \(n\) 个结点可够造多少个不同的二叉树?
  7. \(n\) 个不同的数依次进栈,求不同的出栈结果的种数?
  8. \(n\) 个 \(+1\) 和 \(n\) 个 \(-1\) 构成 \(2n\) 项 \(a_1,a_2, \cdots ,a_{2n}\) ,其部分和满足 \(a_1+a_2+ \cdots +a_k \geq 0(k=1,2,3, \cdots ,2n)\) 对与 \(n\) 该数列为?

它们中我相信大家或多或少接触过一些,在解决这些问题的方法中,Catalan数就是一种很便利的组合数学方法。

定义与性质

首先来看看Wiki对 Catalan 数的定义:

卡特兰数(Catalan number)是组合数学中一个重要的计数数列,在很多看似毫不相关地方都能见到它的身影(目前最早证明卡特兰数的是清朝数学家明安图,所以Catalan数也被称作“明安图数”或“明安图-卡塔兰数”)

卡塔兰数的一般项公式为:

\[C_n = \frac{\binom{2n}{n}}{n+1} = \frac{(2n)!}{(n + 1)!n!}(n \geq 2, n \in \mathbf{N_{+}})
\]

其对应的序列为:

\(C_0\) \(C_1\) \(C_2\) \(C_3\) \(C_4\) \(C_5\) \(C_6\) ...
1 1 2 5 14 42 132 ...

Catalan数的渐近增长为:

\[C_n \approx \frac{4^n}{n^{3/2}\sqrt\pi}
\]

它的含义是当n → ∞时,左式除以右式的商趋向于1。(这可以用\(n!\) 的斯特灵公式来证明。)

所有的奇卡塔兰数\(C_n\) 都满足$ n = 2^k - 1$ 所有其他的卡塔兰数都是偶数。

而且

\(C_n = \int_0^4x^n\frac{1}{2\pi}\sqrt{4/\pi - 1}\)

应用

带限制条件的路径总数

首先我们来看一个问题:

在一个平面直角坐标系中,只能往右或往上走一个单位长度,问有多少种不同的路径可以从左下角 (1,1) 走到右上角 (n,n),并且要求路径不能经过直线 y=x 上方的点,下图中的路径都是合法的(图片来源 Wikipedia)

如果没有限制条件,那么从左下角走到右上角一共有 \(2n\) 步,有 \(n\) 步是往右,另外 n 步是往上,那么路径方案数就是 \(2n\) 步中选择 n 步往右,一共有 \(\begin{pmatrix}2n\\n\end{pmatrix}\) (即 \(C^n_{2n}\))种方案

那么我们考虑一下这里面有多少种方案是不合法的

首先对于每一种不合法的方案,它的路径一定与 y=x+1 有交。我们找到它与 y=x+1 的第一个交点,然后将这个点后面部分的路径关于 y=x+1 做一个对称。由于原来路径到达 (n,n),新的对称之后的路径就会到达 \((n−1,n+1)\)。这样我们把每一种不合法方案都对应到了一条从 (1,1) 到 $(n−1,n+1) $ 的路径,现在再来看是否每一条这样的路径都能对应到一种不合法方案,如果是,那么这就建立了一个一一映射的关系,也就是它们的方案总数相同。这是肯定的,因为每一条这样的路径必定与 y=x+1 有交,那么对称回去,就得到一条不合法方案

由于从$ (1,1)$ 到 \((n−1,n+1)\) 的路径有$ \begin{pmatrix}n−1+n+1\n−1\end{pmatrix} $条,那么合法的方案就是

\[C_n = \begin{pmatrix}2n\\n\end{pmatrix} - \begin{pmatrix}2n \\ n\end{pmatrix} = \frac{1}{n + 1}\begin{pmatrix}2n\\n\end{pmatrix}
\]

我们把这个方案数记为$ C_n$,这就是著名的 Catalan 数

我们来看看它的前几项(\(n\) 从 0 开始)

1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190

括号序列计数

再来看一个问题:有多少种不同的长度为 n 的括号序列?

首先一个括号序列是指 (), ()(), (())() 这样的由括号组成的序列,并且没有左右括号无法匹配的情况

我们可以将长度为 2n 的括号序列映射成刚刚所说的路径:首先对于左括号,那么就向右走一个单位长度,对于右括号,那么就向上走一个单位长度,由于括号序列合法,那么每次向右走的次数不会少于向上的次数,也就是这条路径不会在 y=x 之上。再考虑每一条这样的路径,也能够对应到一种合法的括号序列,因此,长度为 2n 的括号序列的方案数就是 \(C_n\)。

出栈顺序

现在来考虑你有 n 个元素(元素之间是没有区别的)和一个栈,每次可以将一个元素入栈,或者将栈顶元素弹出,问有多少种可能的操作序列,这可以将问题对应成括号序列,入栈为左括号,出栈为右括号,因此方案数也是 \(C_n\)

排队问题

现在有 2n 个人,他们身高互不相同,他们要成两排,每一排有 n 个人,并且满足每一排必须是从矮到高,且后一排的人要比前一排对应的人要高,问有多少种排法

我们考虑先把这些人从矮到高排成一排,那么现在来分配哪个人在前,哪个人在后,例如有 6 个人,身高是 1, 2, 3, 4, 5, 6

那么我们用 1 表示这个人应该在后排,0 表示这个人应该在前排,例如说 100110 表示两排分别是 2, 3, 6 和 1, 4, 5 这是不合法的

那么合法方案应该是怎么样的呢?后排要比前排对应的人高,也就是说 0 的出现次数在每一个地方都不应该小于 1,这恰恰又是一个括号序列,因此,方案仍然是 Catalan 数

二叉树计数

现在你需要统计有多少种不同的 n 个结点的二叉树

图上的是 3 个结点的二叉树,一共有 5 种方案

朴素的想法是由于二叉树是递归定义的,可以考虑使用递推方法

我们可以用 \(f_n\) 表示有 n 个结点的二叉树的方案数(空树算一种,即 \(f_0=0\)),那么枚举子树大小可以得到方程

\[f_n=∑^{i=0}_{n−1}f_if_{n−i−1}
\]

如果直接计算,你需要 $O(n^2) $的时间

现在我们换一个角度来想,对这棵二叉树进行遍历,并且考虑一个括号序列,当第一次遇到这个结点的时候,在括号序列末尾添加一个左括号,在从左子树回到这个结点的时候,在括号序列中添加一个右括号,这样,将每一种不同的二叉树都对应到了一种不同的括号序列,同样对于每一种不同的括号序列都可以找到对应的一种不同的二叉树,因此,有 \(n\) 个结点的二叉树的数量也是 \(C_n\)

ACM训练题

例题洛谷 P1044 栈

题目大意:入栈顺序为 \(1,2,\ldots ,n\) ,求所有可能的出栈顺序的总数。

#include <iostream>
using namespace std;
int n;
long long f[25];
int main() {
f[0] = 1;
cin >> n;
for (int i = 1; i <= n; i++) f[i] = f[i - 1] * (4 * i - 2) / (i + 1);
//这里用的是常见公式2
cout << f[n] << endl;
return 0;
}

待补。。。

参考

Miskcoo's Space关于Catalan数的证明:http://blog.miskcoo.com/2015/07/catalan-nuber

Wikihttps://zh.wikipedia.org/wiki/卡塔兰数

OI wiki:https://oi-wiki.org/math/catalan/

什么是 Catalan 数列以及其应用的更多相关文章

  1. Catalan数列

    引入 今天听学长讲了卡特兰数列后对其有了更深的认识,在此完善了一下之前的博客加以总结. 首先用一个经典的例子来描述一下Catalan数列,我们有一个1~n的数列和一个大小为n的栈,我们有如下两种操作: ...

  2. Catalan 数列的性质及其应用(转载)

    转自:http://lanqi.org/skills/10939/ 卡特兰数 — 计数的映射方法的伟大胜利 发表于2015年11月8日由意琦行 卡特兰(Catalan)数来源于卡特兰解决凸$n+2$边 ...

  3. bzoj1485: [HNOI2009]有趣的数列(Catalan数)

    1485: [HNOI2009]有趣的数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2105  Solved: 1117[Submit][Stat ...

  4. catalan数及笔试面试里那些相关的问题(转)

    一.catalan数由来和性质 1)由来 catalan数(卡塔兰数)取自组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡塔兰数的一般项 ...

  5. bzoj1485:[HNOI2009]有趣的数列

    思路:首先限制数很多,逐步来考虑,限制一很容易满足,考虑限制二,也就是让奇数位和偶数位上的数递增,限制三就是让奇数位上的数小于奇数位加一对应的偶数位上的数,那么我们可以把形成序列的过程看成加数的过程, ...

  6. 从头说catalan数及笔试面试里那些相关的问题 (转)

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11938973. 声明:版权所有,转载请注明出处,谢谢 ...

  7. Catalan数计算及应用

    Catalan数列是非常奇妙的一列数字,因为很多问题的解就是一个Catalan数.知道了这一规律,很多看似复杂的问题便可迎刃而解.那么什么是Catalan数,什么样的问题的解是Catalan数呢? 1 ...

  8. caioj 1204 Catalan数(模板)

    题目中对卡特兰数的总结很不错 以下copy自题目 Catalan数列:1,1,2,5,14,42,(前面几个要背) 即 h(0)=1,h(1)=1,h(2)=2,h(3)=5...公式:h(n)=C( ...

  9. Trees Made to Order——Catalan数和递归

    Trees Made to Order Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7155   Accepted: 40 ...

随机推荐

  1. javaSE总结(转+总结)

    一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具和jre. 2,JRE:Java Runtime Environment,java ...

  2. Newbe.Claptrap 框架如何实现在多种框架之上运行?

    Newbe.Claptrap 框架如何实现在多种框架之上运行?最近整理了一下项目的术语表.今天就谈谈什么是 Claptrap Box. 特别感谢 kotone 为本文提供的校对建议! Newbe.Cl ...

  3. Scala集合中的函数(扩展)

    1.拉链(zip) 将两个集合进行 对偶元组合并,可以使用拉链 object Demo_031 { def main(args: Array[String]): Unit = { val list1 ...

  4. 【接口自动化】Python+Requests接口自动化测试框架搭建【一】

    公司项目启用新框架,前后端分离,所以接口测试成为测试工作中不可缺失的一个环节,现在将从0开始搭建接口自动化测试框架的路程,一步步记录下来. 开发语言我们采用Python+第三方库Requests,测试 ...

  5. Discovering Reinforcement Learning Algorithms

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:2007.08794v1 [cs.LG] 17 Jul 2020 Abstract 强化学习(RL)算法根据经过多年研究手动发 ...

  6. double与Double

    1. double是基本数据类型,Double是原始数据类型(Java 类) 2. double创建引用,Double创建对象 3. double不可以为NULL,Double是类所以其对象是可以为N ...

  7. SpringMVC中前端Form表单提交后跳转不过去的问题

    今天晚上打算谢谢Spring整合这个内容,写的差不多之后运行 出现了各种问题 逐一排查 首先有一个(MyEclipse10) 一: class path resource [spring-mvc.xm ...

  8. SICP之1.3中文翻译题目错误

    原版题目: Exercise 1.3: Define a procedure that takes three numbers as arguments and returns the sum of ...

  9. 3点带你快速学会Selenium工具的使用

    (一)Selenium IDE Firefox的一个插件,有助于我们理解测试框架.在附加组件里搜索下载,一般搜的结果里前几个都不是,得点那个查看更多才行,找到这个: 安装以后浏览器工具栏会有: 安装好 ...

  10. PHP 日期与时间函数详解

    在开发过程中,我们经常碰到日期与时间戳相关的功能,今天趁此机会做个详细笔记. date_default_timezone_set('PRC'); /*把时间调到北京时间,php5默认为格林威治标准时间 ...