卡特兰数超详解

  • Post author:
  • Post category:其他




卡特兰数

卡特兰数是组合数学中一个常出现于各种计数问题中的数列。其前几项为(从第0项开始):1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …

换句话说,如果你在做题时,手动模拟,发现是这样一串数时,就可以往卡特兰数上考虑。




n

n






n









0

0






0









n

n






n









1

1






1





,通过一系列的组合,组成一个长度为



2

n

2n






2


n





的序列,满足任意前缀中0的个数都不少于1的个数的序列数量为





C

a

t

n

=

C

2

n

n

n

+

1

Cat_n= \frac{C^n_{2n}}{n+1}






C


a



t










n




















=




















n


+


1

















C











2


n









n









































卡特兰数经典问题


1.火车进出栈问题


原题目


题目描述




n

n






n





个元素进栈序列为:



1

2

3

4

.

.

.

n

1,2,3,4,…,n






1





2





3





4





.


.


.





n





,则有多少种出栈序列。


问题分析:

如果将入栈设为用



0

0






0





代表,出栈用



1

1






1





代表,因为每个元素都要出栈,进栈,所以就有



n

n






n









0

0






0





,和



n

n






n









1

1






1





,而一个数只有先进栈才能出栈,所以这个问题就变成了,求



n

n






n









0

0






0









n

n






n









1

1






1





,通过一系列的组合,组成一个长度为



2

n

2n






2


n





的序列,满足

任意前缀

中0的个数都不少于1的个数的序列数量为。请注意这个任意前缀就限定了在前缀中



0

0






0





肯定在1的前面。例如如果



n

=

2

n=2






n




=








2





,排列顺序为



1010

1010






1


0


1


0





,其前缀



1

1






1





和前缀



101

101






1


0


1





不满足0的个数都不少于1的个数,但当排序为



0101

0101






0


1


0


1





时,任意前缀均满足0的个数都不少于1的个数。所以就将该问题抽象成了卡特兰数问题。


2.括号问题


题目描述




n

n






n





个左括号与



n

n






n





个右括号所组成的合法括号序列的数量为



C

a

t

n

=

C

2

n

n

n

+

1

Catn=\frac{C^n_{2n}}{n+1}






C


a


t


n




=




















n


+


1

















C











2


n









n








































问题分析:

同理将左括号用



0

0






0





表示,右括号用



1

1






1





表示,每个左括号需要匹配一个右括号,并且只有有一个左括号才会有一个右括号,这就又抽象成了



n

n






n









0

0






0









n

n






n









1

1






1





,通过一系列的组合,组成一个长度为



2

n

2n






2


n





的序列,满足

任意前缀

中0的个数都不少于1的个数的序列数量,所以合法括号序列的数量为



C

a

t

n

=

C

2

n

n

n

+

1

Catn=\frac{C^n_{2n}}{n+1}






C


a


t


n




=




















n


+


1

















C











2


n









n








































3.二叉树问题




n

n






n





个节点构成的不同二叉树的数量为



C

a

t

n

=

C

2

n

n

n

+

1

Catn=\frac{C^n_{2n}}{n+1}






C


a


t


n




=




















n


+


1

















C











2


n









n







































这里的二叉树指的是满二叉树,及如果一棵二叉树的结点要么是叶子结点,要么它有两个子结点,这样的树就是满二叉树。


问题分析:

因为是满二叉树,所以每一个节点必有一个左子树和一个右子树,对于具有 n( n>1 )个结点的二叉树来说,都可以看成是一个根结点、由$ i$ 个结点组成的左子树和由$ n-i-1$ 个结点组成的右子树。因为在生成二叉树时,先生成左子树,再生成右子树,将左子树中的节点设为



0

0






0





,右子树中的节点设为



1

1






1





,而具有同一个父节点的左右节点是匹配的,这就与括号匹配和进出栈问题类似,所以可以用卡特兰数解决。


4.卡特兰数的几何意义


卡特兰数的几何意义

利用卡特兰数的几何意义解决问题:

[SCOI2010]生成字符串



总结

卡特兰数问题中都会存在一种匹配关系,如进出栈匹配,括号匹配等,一旦计数问题中存在这种关系,那我们就需要去考虑这是否是卡特兰数问题。此外,我们还可以记住序列前四项:

1, 1, 2, 5

,这些将有利于我们联想到卡特兰数。



卡特兰数练习题


进一步详细的学习卡特兰数


1641 [SCOI2010]生成字符串



版权声明:本文为qq_42376883原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。