问题引入
使用
设
由于非空的二叉树是由根节点、左子树、右子树组成的,考虑对左子树节点数量进行枚举,所以有:
这里
基本模型
模型 1:
给定
一开始就已经说过了,证明略。
模型 2:
长度为
证明:
记长度为
首先当
考虑
我们再将最后一个右括号所对应的左括号表示出来,括号序列就可以表示为如下形式:A(B)。
其中 A 与 B 必为合法的括号序列(可能为空),枚举 A 的长度,所以有:
模型 3:
长度为
证明:
不难发现,对于两种不同的进出栈操作,他们的出栈序列肯定是不同的,所以出栈序列种数其实就是求合法操作数。
那什么样的操作是合法的呢?
我们将一次进栈操作看为一个左括号,一次出栈操作看为一个右括号。
那么,当进栈次数与出栈次数相同,且任何时候当前进栈次数大于等于出栈次数时,
这个出栈序列是合法的,且括号序列也是合法的。
反之也成立。
所以其实这和模型2是一样的。
模型 4:
给定
证明:
只需要让任何时候
将
模型 5:
给定
证明:
很容易发现这就是不合法的序列的个数。
所以答案为
模型 6:
一个圆上有
证明:
将这
设答案为
解释:
设
问题扩展
使用
显然,如果利用上述公式进行计算,时间复杂度为
定理一:
证明:
使用模型
首先我们知道
如果一个序列是不合法的,那么说明至少存在一个
那么我们设这样的
假如对于下面这个序列,满足条件的
显然会有
举个梨子,假如序列长这个样子:
我们把他的图画出来。
显然,在这个例子中
然后我们将前
显然,会得到的一个有
上面的序列翻转后得到的序列是
假设翻转后的序列为
显然会有
显然,对于每一个序列
对于每一个序列
证明方法差不多,找出第一个使前缀和
值得注意的是,因为
翻转之后就能变成一个序列
综上所述,
又因为
所以他们的数量都为
合法序列数量即为
定理二:
考虑使用定理一进行推导:
他的另一种形式是:
定理三:
证明:
考虑使用定理二:
注:上述证明参考自:
【知识总结】卡特兰数 (Catalan Number) 公式的推导
例题
例1
与模型三一样,证明略。
例2
我们不妨将每一行最后一个格子成为特殊格。
不难发现,每摆放一份钢材,最多只有一个特殊格被覆盖,所以每一次摆放钢材时必须要覆盖到一个特殊格。
显然,最左下角的格子也会被覆盖一次(没错,这是一句废话),那么我们就可以枚举一下和左下角格子一起被覆盖的是哪一个特殊格。
给出
摆放钢材后这个楼梯形状的物品便被分为了两个楼梯,故这是一个 Catalan 数列。
注意:本题没有模,所以需要使用高精。
例3
与模型
例4
首先我们对题意进行转化,不妨将整个序列拆成两个,一个由原下标为奇数的组成,另一个由原下标为偶数的组成。
显然,这两个序列都是递增的。
那么,题意就可以转化为:对于
现在我们还有一个条件:就是奇数序列对应数字比偶数序列对应数字小。
这该怎么办呢?其实我们再将这个条件进行转化:
在任意时候,偶数序列数字个数都比奇数序列数字个数多。
所以,当序列长度为
本题还有一个难点,就是没有保证模数是质数。实际上,我们只要求出
即可计算答案。
目前还没有找到别的啥题要讲,就先咕咕咕。