卡特兰数 Catalan 数列

引入

有一个无限大的栈,进栈的顺序为 \(1,2,\cdots,n\),求有多少种不同的出栈序列。

设 \(h[n]\) 为 \(n\) 个数的出栈序列方案数。

可以这样想 \(k\) 是最后一个出栈的数,那么比 \(k\) 早进栈早出栈的有 \(k-1\) 个,方案数也就是 \(h[k-1]\)。同理比 \(k\) 晚进栈早出栈的方案数就是 \(h[n-k]\),那么 \(k\) 作为最后一个出栈的数贡献的方案数为 \(h[k-1]h[n-k]\)。

由于 \(1\) 到 \(n\) 中任何一个数都可以成为 \(k\),那么 \(h[n]\) 的方案数就是 \(h[n]=\sum_{i=1}^n h[i-1]h[n-i]\)。

\(h\) 就是卡特兰数列。

应用问题

  • 1.有 \(2n\) 个人排队买票,票 \(5\) 元一张。有 \(n\) 个人有 \(5\) 元钞票,另外 \(n\) 个人有 \(10\) 元钞票,售票处没有其它钞票,求有多少种排队顺序不会使售票处无法找零。

    分析:每一个 \(10\) 元的钞票都需要一个 \(5\) 元的钞票,不妨把 \(5\) 元看成进栈 \(10\) 元看成出栈,每一种出栈序列对应一种排队方案,问题变为引入问题,答案为 \(h[n]\)。

  • 2.学校在坐标 \((n,n)\) 处,每天彬彬上学会从 \((0,0)\) 出发,向 \(x\) 轴正方向走 \(n\) 步,向 \(y\) 轴正方向走 \(n\) 步,求不穿过(可以碰到)\((n,n)\) 与 \((0,0)\) 对角线(即直线 \(y=x\))的路径数(只走直线 \(y=x\) 下方)。

    分析:如果想不穿过对角线那么可以移动看做进栈和出栈。如上题,一种出栈序列对应一种路径方案,答案为 \(h[n]\)。

总结:对于一些问题,可以转换成不同出栈序列的问题,那么便可以由卡特兰数得到。

  • 3.有一个 \(n\) 条边的凸多边形,用直线连接对角线,使该多边形分为多个三角形,每条直线不相交,问有多少种划分方法。

    分析:我们先将多边形顺序编号 \(p_1,p_2,\cdots,p_n\),选择基边 \(p_1p_n\),再任选一个点 \(p_k\ (2\leq k \leq n-1)\),连接 \(p_1p_k,p_np_k\),这样(除连接的三角形外)将多边形重新分为了一个 \(k\) 边型和 \(n-k+1\) 边型,那么设 \(f[n]\) 为 \(n\) 边型的答案,有 \(f[n]=\sum_{i=1}^n h[i-1]h[n-i]\)。这正是卡特兰数的递推公式。

  • 4.圆环上有 \(2n\) 个点,求点成对连接,线段不相交的方案数。

    分析:和上述一样,选择后点对后会分为两部分,将两部分独立处理即可。

总结:如果一个问题可以通过枚举来分为两部分,通过乘法和加法原理得到相同的递推式,那么也是卡特兰数列。在做题中,我们可以先设 \(dp\) 在推式子,得出 \(dp\) 的递推公式,再来判断卡特兰数;或者先看能否分为两部分,再推式子。

公式

使用应用问题 \(2\) 推导:

先不管不管对角线限制,从 \((0,0)\) 到 \((n,n)\) 的路径数为 \(C_{2n}^n\)。

在减去穿过对角的路径数,即减去触碰到 \(y=x+1\) 的直线的路径数。

把一条路径碰到 \(y=x+1\) 之前的路径以 \(y=x+1\) 为对称轴翻转,发现每次的起点都变成 \((-1,1)\)。

图中黄线为原触碰 \(y=x+1\) 的路径,灰色为关于 \(y=x+1\) 翻折的部分。

那么不合法线段的选择数就是从 \((-1,1)\) 走到 \((n,n)\) 的方案数。(无论怎么走都会触碰红线)

那么合法的方案数就是 \(总方案数-不合法方案数\),即 \(h[n]=C_{2n}^n-C_{2n}^{n-1}\)。

化简后变得到了 \(h[n]\) 的递推式,\(h[n]=C_{2n}^n-C_{2n}^{n-1}=\frac{C_{2n}^n}{n+1}\)。

卡特兰数 Catalan 数列的更多相关文章

  1. 卡特兰数 Catalan数 ( ACM 数论 组合 )

    卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1)  编辑 收藏 引用 所属分类: ACM ( 数论 ...

  2. 浅谈卡特兰数(Catalan number)的原理和相关应用

    一.卡特兰数(Catalan number) 1.定义 组合数学中一个常出现在各种计数问题中出现的数列(用c表示).以比利时的数学家欧仁·查理·卡特兰的名字来命名: 2.计算公式 (1)递推公式 c[ ...

  3. 卡特兰数 catalan number

    作者:阿凡卢 出处:http://www.cnblogs.com/luxiaoxun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...

  4. 卡特兰数(Catalan Number) 算法、数论 组合~

    Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡特兰数的前几个数 前20项为( ...

  5. 卡特兰数(Catalan)及其应用

    卡特兰数 大佬博客https://blog.csdn.net/doc_sgl/article/details/8880468 卡特兰数是组合数学中一个常出现在各种计数问题中出现的数列. 卡特兰数前几项 ...

  6. 卡特兰数 (Catalan)

    卡特兰数:(是一个在计数问题中出现的数列) 一般项公式: 1.         或       2.   递归公式: 1.  或 2. 注:全部可推导. (性质:Cn为奇数时,必然出现在奇数项 2k- ...

  7. 卡特兰数 Catalan 笔记

    一.公式 卡特兰数一般公式 令h(0)=1,h(1)=1,catalan数满足递推式.h(n) = h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>= ...

  8. ACM数论-卡特兰数Catalan

    Catalan 原理: 令h(0)=1,h(1)=1,catalan 数满足递归式: (其中n>=2) 另类递推公式: 该递推关系的解为: (n=1,2,3,...) 卡特兰数的应用实质上都是递 ...

  9. 卡特兰数(Catalan Number) 学习笔记

    一.三个简单的问题 1.给定一串长为2n的01序列,其中0和1的数量相等,满足任意前缀中0的个数不少于1的个数,求序列的个数 2.给出一串长为n的序列,按顺序将他们进栈,随意出栈,求最后进出栈的方案 ...

  10. 【知识总结】卡特兰数 (Catalan Number) 公式的推导

    卡特兰数的英文维基讲得非常全面,强烈建议阅读! Catalan number - Wikipedia (本文中图片也来源于这个页面) 由于本人太菜,这里只选取其中两个公式进行总结. (似乎就是这两个比 ...

随机推荐

  1. 网络问题mark

    复杂且混乱的网络环境, 主内网是192.168.0.254(网关), 中间混杂无数网段 , 无数dhcp, 同时还有0段的外网(跟254没关系) 现在是有一台服务器 , 192.168.0.47 , ...

  2. C# 导出Excel NPOI 修改指定单元格的样式 或者行样式

    参考文章:原文链接:https://blog.csdn.net/chensirbbk/article/details/52189985 #region 2.NPOI读取Excel 验证Excel数据的 ...

  3. Shell 避免无限递归

    在编写 Shell 脚本时,有时会产生我们不期望的递归. 比如说,我曾经写过一个脚本,名为 foo.sh. foo.sh 的内容如下: function foo { # TODO } foo 然后我在 ...

  4. 查看 Homebrew 管理的服务的日志

    TL;DR 首先找到 log 文件的位置: 对于 macOS (arm64),log 文件在 /opt/homebrew/var/log 目录下 对于 macOS (x86_64),log 文件在 / ...

  5. LaTeX 编译 acmart 文档报错:No country present for an affiliation.

    在编译一篇从 arXiv 下载的文档时遇到如下错误: Class acmart Error: No country present for an affiliation. 有两种解决方案: 将错误降级 ...

  6. 探索一下 Enum 优化

    探索一下 Enum 优化 SV.Enums主要是探索如何让 enum 更高效 其中涉及的优化手段并非完全自创 很多内容参考于以下项目 NetEscapades.EnumGenerators FastE ...

  7. maven 网关应用:[NACOS ConnectException httpPost] currentServerAddr: http://localhost:8848,

    网关应用运行忽然报错:[NACOS ConnectException httpPost] currentServerAddr: http://localhost:8848, 虽然调整了代码逻辑,但是n ...

  8. c程序设计语言 by K&R(二)指针与数组

    指针与数组 1. c语言只有值传递,没有引用传递 可通过指针交换 #include <stdio.h> #include <stdlib.h> void swap(int* a ...

  9. MonoDevelop 的续集dotdevelop

    DotDevelop 是一个跨平台的 .NET 集成开发环境(IDE),它原本是 MonoDevelop 的分支项目,这个项目更侧重于 Linux 支持和 GTK3 升级,github:https:/ ...

  10. shell脚本参数读取列表文件,循环执行时,要注意这个列表文件转换成 unix 格式

    当报一些很奇怪的错,比如报错多了一个空格,但 vim 看打开没有,比如: 或者肉眼看上去路径正常,但却报路径不存在: 这种时候要使用 dos2unix 工具,把这个列表文件转换一下: