Loading [MathJax]/jax/output/CommonHTML/autoload/mtable.js

[数学]卡特兰数

前言

咕比赛写博客的我。哭哭。
本篇文章的剩余部分中,我们定义C(n)C(n)为卡特兰数的第nn

定义

翻阅了一堆文章,也没找到真正的定义,暂且拿这个充当定义:
C(n)C(n)表示,从原点出发,每次向x或y轴正方向移动1单位,到达点(n,n),且在移动过程中不越过第一象限平分线的移动方案数。

通项公式

我们记C(n)C(n)为卡特兰数的第nn

C(n)=(2nn)(2nn+1)

证明


首先根据组合数学,我们知道如果不考虑第一象限平分线的限制,方案数为(2nn)
注意到任何一种非法的方案,都至少有一个点p碰到了直线y=x+1,那么我们将这条路径在p点以上的在直线y=x+1以下的部分沿直线y=x+1镜像到直线y=x+1上。
看图理解:上图中的绿线为y=x+1,红线为原非法路径在p上的部分,蓝线为镜像后的结果。
我们会发现任何一种非法方案都可以变换成(0,0)到(n-1,n+1)的一条路径,且存在一一映射关系,所以总方案数为:(2nn)(2nn+1)

化简

C(n)=(2nn)(2nn+1)

=(2n)!n!n!(2n)!(n+1)!(n1)!

=1n+1((2n)!(n+1)n!n!(2n)!n!(n1)!)

=1n+1((2n)!(n+1)n!n!(2n)!×nn!n!)

=1n+1(2n)!(n+1)(2n)!×nn!n!

=1n+1(2n)!n!n!

=1n+1(2nn)

变形

C(n)=1n+1ni=0(ni)2

递推

C(n+1)=ni=0C(i)C(ni), C(0)=1

C(n+1)=2(2n+1)n+2C(n), C(0)=1

应用

  1. n对括号的合法配对方案书
  2. n个节点的二叉树的形态数
  3. n+1个叶子(n个非叶节点)的满二叉树的形态数, 走到左儿子+1,走到 右儿子-1,类似于括号匹配(大致同2)
  4. n个数入栈后出栈的排列总数
  5. 对凸n+2边形进行不同的三角形分割的方案数(分割线断点仅为顶点,且分割线仅在顶点上相交)
  6. n层的阶梯切割为n个矩形的切法数

卡特兰数与OI初赛

首先背诵上述应用场景,然后记忆卡特兰数的前几项:1,1,2,5,14,42,132。

拓展

n+m个人排队买票,并且满足nm,票价为50元,其中n个人有且仅有一张50元钞票,m个人有且仅有一张100元钞票,初始时候售票窗口没有钱,问有多少种排队的情况数能够让大家都买到票。
如果n=m可以直接用Catalan数解决,也就是将有50元的人看成是上述应用中的左括号,有100元的人看成是右括号。
对与n>m的情况,假设所有人都可以买到票的情况数是An,m,不能让每个人都买到的情况数是Bn,m,设最早买不到票的人为p,他一定手持100元且售票处没有50元,那么这时将前p个人的钱从50元变成100元,从100元变成50元(不考虑顺序,所以没有影响),这时候就有n+1个人有50元,m1个有100元的,所以就得到Bn,m=(n+mn+1),那么An,m=(n+mn)(n+mn+1)
这正是应用了上文证明的"翻折"思想。

posted @   LinZhengmin  阅读(10425)  评论(6编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?

Contact with me

点击右上角即可分享
微信分享提示