卡特兰数 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. Linux 网络设备命名规则

    在 Linux 系统中,网络接口的命名规则已经经历了几次重要变化,特别是从传统的以 eth 和 wlan 开头的名称,转变到更现代.更具描述性的命名方式.以下是这些变化的概述: 1. 传统命名约定 在 ...

  2. Docker高级篇:实战Redis集群!从3主3从变为4主4从

    通过前面两篇,我们学会了三主三从的Redis集群搭建及主从容错切换迁移,随着业务增加,可能会有主从扩容的,所以,本文我们来实战主从扩容 PS本系列:<Docker学习系列>教程已经发布的内 ...

  3. Angular Material 18+ 高级教程 – CDK Accessibility の Focus

    介绍 CDK Focus 是对原生 DOM focus 的上层封装和扩展. Focus Origin 原生 DOM focus 我们只能知道 element 被 focus 了,但是无法知道它是怎么被 ...

  4. Tomcat——idea集成本地Tomcat

    IDEA 集成本地Tomcat 添加配置      添加本地Tomcat服务器      配置本地Tomcat路径      部署项目             在 webapp 中添加一个简单的页面作 ...

  5. Qt中一些关于中文的使用

    本文包含以下内容: 中文编码 按中文字典排序 中文首字母查找 版本:Qt5.14.2 中文编码     在一些老项目中,发现项目中使用的文件是GBK编码,而新项目使用的是Unicode编码,在有一些操 ...

  6. Android Qcom USB Driver学习(七)

    最近遇到了USB 插拔后,系统重启的问题,抓取串口log发现如下问题,log中查看trace分析就是空指针造成的panic Unable to handle kernel read from unre ...

  7. python安装sklearn

    安装sklearn这个包,首先要安装三个依赖包,如图划红线的部分. 要找这三个包,我们都可以登录:https://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy 这 ...

  8. 墨天轮访谈 | 华为云温云博:从客户视角出发,GaussDB(for Redis)究竟“香”在哪里?

    分享嘉宾:温云博 华为云数据库NoSQL团队研发工程师 整理:墨天轮社区 导读 GaussDB(for Redis)采用云原生分布式架构,完全兼容Redis协议,支持丰富数据类型. 提供数据实时持久化 ...

  9. Vue3中的新的内置组件

    在vue2中的内置组件: 动态路由中的 component :作用:动态显示路由的挂载点,使用 is 属性动态显示组件 : keep-alive :作用:使被包裹的组件保留状态,避免被重新渲染 : 路 ...

  10. rocketmq安全漏洞

    漏洞内容 服务器支持 TLS Client-initiated 重协商攻击(CVE-2011-1473)[原理扫描] 该漏洞存在于SSL renegotiation的过程中.对于使用SSL重协商功能的 ...