卡特兰数入门

卡特兰数可以解决一些计数问题,还是挺常用的。

前几项是 1,1,2,5,14,42,132,

下文用 Cn 表示卡特兰数第 n 项,n0 开始

公式

如果不记得通项,可以用下面的一些经典模型推导出来。

通项

Cn=(2nn)(2nn1)

也可以写成

Cn=(2nn)n+1

其它公式

如果见到了下面这两种,要记得是卡特兰数,可以 O(1) 计算。

Cn=i=1nCi1Cni

Cn=4n2n+1Cn1

经典问题

网格路径问题

(0,0) 走到 (n,n),只能向右或向上走,不能穿过 y=x 的路径条数为 Cn

如果不考虑“不穿过”的限制,相当于在 2n 个点选择 n 次向右(或向上),这是个经典问题,方案数为 (2nn)。现在只需要减去不合法的方案数。

考虑一条不合法的路径,穿过 y=x 相当于在某个点触碰到了 y=x+1。将这个触碰点之后的右、上移动交换,那么最后一定走到 (n1,n+1),因此不合法路径的数量为 (2nn1)

那么方案为 (2nn)(2nn1),这是卡特兰数。

括号序列(±1序列)问题

这两个问题本质上是一样的。

括号序列:求有多少长度为 2n 的合法括号序列。
±1序列:将 n1n1 排列,使得任意前缀之和 0

以±1序列为例,总数是 (2nn),只需要减去不合法数量。考虑一种不合法排列,必然有一个位置 p 的前缀和 =1,则 1p11 多一个, p+1n11 多一个。现在将 p+1n 的数字取反,整个序列就变成由 n+11n11 组成的序列,方案数为 (2nn1)

最终还是 (2nn)(2nn1),是卡特兰数。

进出栈问题

1,2,3,,n 依次进栈,求出栈序列的数量。

枚举 1 的进出栈时间,整个过程可以表示为

  1. 1 进栈。
  2. 2p 全部进栈并出栈。
  3. 1 出栈。
  4. p+1n 全部进栈并出栈。

fn 表示 n 个不同的数的出栈序列数量,那么

fn=k=1nfk1fnk

这是卡特兰数的一个公式。

二叉树形态问题

n 个点的二叉树有多少种形态。

fn 表示 n 个点二叉树的形态数量,将左子树看成一个部分,右子树看做另一个部分,那么可以得到转移

fn=k=0n1fkfnk1

这与 fn=k=1nfk1fnk 是一样的,是卡特兰数。

变式及应用

Problem 1

2n 个不同的数分为两个大小为 n递增数列 a,b,求使得 i,ai<bi 的方案数。

考虑这 2n 个数的一个排列,我们将其中 a 中的数替换为 “(”,b 中的数替换为 “)”,那么 a,b 是合法划分当且仅当括号序列合法。所以方案数就是卡特兰数 Cn

如何理解这个转化呢?对于转化后的括号序列,对于从左到右的每一个左括号,将其看做 a1,a2,a3,与之匹配的右括号看做 b1,b2,b3,。那么显然只有合法的括号序列对答案有贡献,并且不同的合法括号序列对应不同的划分方案。

应用:牛客练习赛105C - 打牌的贝贝

本文作者:hzy1

本文链接:https://www.cnblogs.com/hzy1/p/16869605.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hzy1  阅读(146)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起