卡特兰数(Catalan Number)是一连串整数序列,其通项公式为
C
a
t
a
l
a
n
(
n
)
=
C
2
n
n
n
+
1
Catalan(n)=\frac{C_{2n}^{n}}{n+1}
Catalan(n)=n+1C2nn
前几项为(从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
应用
-
Duck Word: 设一个字符串长度为2n,分别由n个x和y组成,求所有的前缀子串皆满足x的个数大于等于y的个数,带入公式计算,假设n=3:
C a t a l a n ( 2 n ) = C 2 n n n + 1 = C 6 3 4 = 5 Catalan(2n)=\frac{C_{2n}^{n}}{n+1}=\frac{C_{6}^{3}}{4} =5 Catalan(2n)=n+1C2nn=4C63=5
可以看出共有5种情况,以下设这五种序列
XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY -
将上述的X换成左括号,Y换成右括号,就可以将问题改成求有多少组包含n组括号的合法运算公式个数
((())) ()(())() ()()() (())() (()()) -
n个节点组成的不同构二叉树个数
-
2n+1个节点组成的不同构满二叉树个数
注意:这里的满二叉树定义为:只含有叶子节点以及度为0的节点的二叉树
以上均为满二叉树,只含有度为0和2的结点,不含有度为1的结点 -
通过连结顶点而将n + 2边的凸多边形分成三角形的方法个数
上图所示,六边形为Catalan(4),共有4中划分方法 -
表示n个元素的进出栈置换个数
-
表示所有在n × n格点中不越过对角线的单调路径的个数
上图n=4,结果为Catalan(2n)
递推公式:
C
a
t
a
l
a
n
(
n
)
=
C
a
t
a
l
a
n
(
n
−
1
)
∗
4
∗
n
−
2
n
+
1
Catalan(n)=Catalan(n-1)*\frac{4*n-2}{n+1}
Catalan(n)=Catalan(n−1)∗n+14∗n−2
做题数据不大的时候可以BigInteger打表O(∩_∩)O
BigInteger[] a=new BigInteger[105];
a[0]=BigInteger.ONE;
for(int i=1;i<101;i++) {
a[i]=a[i-1].multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1));
}