浅谈卡特兰数
Xingk_YAMINO · · 个人记录
浅谈卡特兰数
(图片由于一些原因被吃啦,图片请移步至博客园我的blog)
什么叫卡特兰数
卡特兰数是组合数学中的一个分支,主要用于求解在一定的条件下满足条件的方案数,在此,我们将通过一些题目来帮助你理解卡特兰数。
一些基本的题型
括号问题
题面:比如有 n 个左括号,有 n 个右括号,求解有多少个合法的方案能使括号两两配对?
或许大多数人在看到这类括号的问题,都会有一种无力感,无奈之下,只能择打暴力,但肯定是不优的,毕竟实在是太慢了。
其实,这是卡特兰数的经典例题,在了解它之前,我们先了解一下
当
那我们如果将第一行上的每个数表示为"("的位置,第二行上每个数表示为")"的位置,那么每一个
比如说以下这个表:
1 3 4
2 5 6
得出:
1 2 3 4 5 6
( ) ( ( ) )
毫无疑问,这是合法的。那么一个长度为
那为什么他是对的呢?
我们在第一行填入的数一定是小于自己下面的数字的,那么最后一个数字
(不用着急了解卡特兰数,我们先看完接下来几道题)
排队问题
题面:给定
毫无疑问,这就是一道标准
出入栈问题
假设入栈顺序为1......n,所有可能的出栈数目为多少。
说白了就是有多少中出入栈的方案数,我们尝试枚举一个小一点的数。
考虑当
我们想想我们经常用栈处理什么问题?不错,是 括号问题,因为他有一种先进后出的特性,那么我们这里完全可以转换为括号匹配问题来做。
最经典的就是列车调度问题。
Dyck words问题
所谓长为
在遇到这个题的时候,一开始我也是一脸懵逼的,但是,如果我们仔细想想,我们可以发现这就是个括号匹配问题,假如我们将0看做“(”,把1看做“)”,那么我们就可以得到一个括号串,我们都知道,如果一个括号串合法,那么前x个括号里面“)”的个数肯定不会大于“(”的个数 ,因为那样就会直接不合法。就这样的,我们成功地将其转换为括号问题。
我们来看个例子:有
毫无疑问,我们可以将其转换为一个Dyck words问题,将那些手握50元软妹币的人视作0,其余的视作1,然后用卡特兰数就可以了。
群峰问题
题面:目前你能画 n 条斜向上的线条,也能画 n 条斜向下的线条,每条线条的长度都是相等且固定的,问你能画出多少种群峰?
我们考虑事先枚举,当
怎么做呢?
我们能发现,只要这两种线的长度相等且数目相等,那么我们一定能在最后一次回到高度为0的位置,也就是我们起步的那一条横线 上,那这道题就简单很多了,我们可以将其转换为括号问题,因为其最终结果一定都是回到原点,那么我们就考虑将斜向上的问题看做“(”,斜向下的线条看作“)”,那这道题就好做了。
那我们如何说明其正确性呢?首先,我们不可能出现开局就一直往下的情况,且题目也不允许我们画到水平线下方,那么我们就基本可以排除遇到“)”而没有“(”的情况了,还是前面的证明,因为数目相同,所以肯定会两两配对,因此以做括号问题的思路做是完全没有问题的。
无法穿越的对角线
题面:有一个
这便是题目大意。
我们依旧是枚举一下,当 n =4 时 ,结果为 15 。
但是,枚举是一回事,如何算出正确的结果又是一码事了,我们能像前面那样将题目转换为之前的某种知识点呢?
答案是可以的,假如我们将图逆时针旋转135度,这时候我们能得到群峰模型:
我们就可以通过群峰的做法来做了。
再探群峰问题
我们转回头再看看群峰问题,之前我们是没有严谨地解决过题目的,这次我们就用群峰模型来讲讲如何做卡特兰数。
我们之前讲过群峰模型是肯定会回到水平面的,所以我们考虑分治为两个与自身情况相同但是规模变小的子问题。我们以水平线为标准,如果能碰到水平线,那么我们就将这个碰到水平线的位置作为一个分界线,左边是一个子问题,右边是一个子问题,如此分下去直到问题简单可解。
稍微解释一下这个图,我们将其分为两个部分,一个是左边的,一个是右边的,这两个子问题的数目总和就可以是
那么为什么是 n-i-1呢,因为你会发现,我们其实是存在0,这个选项的,并且我们不可能取到n这个数,所以也就有了个-1.
我们前面讲题的时候,会发现这和卡特兰数是直接挂钩的,不错,这就是卡特兰数的递推式
我们看看能不能伸展一下,不能拘泥于一个递推式。
我们可以知道
具体如何验证:由于我是个蒟蒻,不会用微积分对
我们用一波牛顿二项式定理,整理得
这就是著名的卡特兰数的组合数公式。
但是,我们在生活中用的更多的是这个公式的变形式:
但是这和我在做题时看到的样子不一样啊喂!他们都是要求我们不能低于什么数值的,或是极其隐晦地说出来,怎么可能那么简单地让你做出来?能看出这是卡特兰数已经是我的极限了喂!
我们简单地看这么道题:有一个长度为2n的01序列,其中1,0各n个,要求对于任意的整数
毫无疑问,我们可以直接用第二个式子,但是我们还是得学习一下下面的这个思想。
不知道哪位神仙把它丢进了笛卡尔坐标系中,是1的就是向上走,是0的就是向下走,我们不能有-1以下的数 ,开始时肯定是(0,0),结果也一定是(2n,0),作图就是这样:
当然,这是个伪作图,因为合法的方案中没有-1的。
我们是不可能接触到
此时,我们是必定会经过
此时的路径数量也不是特别难求,由于终点向下移了两位,所以此时终点在(2n,-2)的位置,所以不符合要求的方案为
这,就是卡特兰数。
(感谢@GuidingStar,他为我提供了证明,同时也解决了一些关键性的问题)
(资料引自北京交通大学的课件,以及[巨佬的博客][https://blog.csdn.net/qq_30115697/article/details/88906534])
讨论群:857464768