卡特兰数入门
卡特兰数可以解决一些计数问题,还是挺常用的。
前几项是
下文用 表示卡特兰数第 项, 从 开始。
公式
如果不记得通项,可以用下面的一些经典模型推导出来。
通项
也可以写成
其它公式
如果见到了下面这两种,要记得是卡特兰数,可以 计算。
经典问题
网格路径问题
从 走到 ,只能向右或向上走,不能穿过 的路径条数为 。
如果不考虑“不穿过”的限制,相当于在 个点选择 次向右(或向上),这是个经典问题,方案数为 。现在只需要减去不合法的方案数。
考虑一条不合法的路径,穿过 相当于在某个点触碰到了 。将这个触碰点之后的右、上移动交换,那么最后一定走到 ,因此不合法路径的数量为 。
那么方案为 ,这是卡特兰数。
括号序列(±1序列)问题
这两个问题本质上是一样的。
括号序列:求有多少长度为 的合法括号序列。
±1序列:将 个 和 个 排列,使得任意前缀之和 。
以±1序列为例,总数是 ,只需要减去不合法数量。考虑一种不合法排列,必然有一个位置 的前缀和 ,则 中 比 多一个, 中 比 多一个。现在将 的数字取反,整个序列就变成由 个 和 个 组成的序列,方案数为 。
最终还是 ,是卡特兰数。
进出栈问题
依次进栈,求出栈序列的数量。
枚举 的进出栈时间,整个过程可以表示为
- 进栈。
- 全部进栈并出栈。
- 出栈。
- 全部进栈并出栈。
设 表示 个不同的数的出栈序列数量,那么
这是卡特兰数的一个公式。
二叉树形态问题
求 个点的二叉树有多少种形态。
设 表示 个点二叉树的形态数量,将左子树看成一个部分,右子树看做另一个部分,那么可以得到转移
这与 是一样的,是卡特兰数。
变式及应用
Problem 1
将 个不同的数分为两个大小为 的递增数列 ,求使得 的方案数。
考虑这 个数的一个排列,我们将其中 中的数替换为 “”, 中的数替换为 “”,那么 是合法划分当且仅当括号序列合法。所以方案数就是卡特兰数 。
如何理解这个转化呢?对于转化后的括号序列,对于从左到右的每一个左括号,将其看做 ,与之匹配的右括号看做 。那么显然只有合法的括号序列对答案有贡献,并且不同的合法括号序列对应不同的划分方案。
本文作者:hzy1
本文链接:https://www.cnblogs.com/hzy1/p/16869605.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步