卡特兰数
卡特兰数的推导公式是:
f(n)=∑k=1nf(k−1)f(n−k)f(n) = \sum_{k=1}^n{f(k-1)f(n-k)}f(n)=∑k=1nf(k−1)f(n−k)
f(0)=1f(0) = 1f(0)=1
f(1)=1f(1) = 1f(1)=1
它和斐波那契数列是很相似的都是将后面的问题分解为前面的问题。
进出栈问题
栈是一种先进后出(FILO,First In Last Out)的数据结构.如下图1,2,3,4顺序进栈,那么一种可能的进出栈顺序是:1In→2In→2Out→3In→4In→4Out→3Out→1Out1In→2In→2Out→3In→4In→4Out→3Out→1Out1In→2In→2Out→3In→4In→4Out→3Out→1Out, 于是出栈序列为1,3,4,2。对于一个还有nnn个数的数组来说,假设第kkk个为最后出栈那么有f(k)f(k)f(k)在它前面出栈,以及f(n−k)f(n-k)f(n−k)在它后面出栈,因此对于第k个数最后出栈它有f(k)f(n−k)f(k)f(n-k)f(k)f(n−k)种方式,又因为所以数可能是最后一个出栈因此所有可能就是一个卡特兰数。
二叉树构成问题
有n个结点,问总共能构成几种不同的二叉树。如果采用中序遍历的话,根结点第k个被访问到,则根结点的左子树有k-1个点、根结点的右指数有n-k个点。k的取值范围为1到n,因此也是一个卡特兰数。
突多边形的构成
对于一个凸多边形,假设它有n+2(n>=1)n+2(n>=1)n+2(n>=1)个节点,随机选取一条边作为基,然后它与第kkk个节点分别否可以连接并且将它们分为两部分,那么其中kkk个节点可以有f(n−k)f(n-k)f(n−k)种情况,剩下的n−kn-kn−k个节点有f(n−k)f(n-k)f(n−k)种情况。因此也是一个卡特兰数。
律师上班问题
一个n*n的格子,只能往上或者往右走,假设走到kkk,则前面有f(k)f(k)f(k),后面有f(n−k)f(n-k)f(n−k),因为k可以从0到n所以一共有f(n)f(n)f(n)种。
括号匹配问题(5元10元买汽水问题)(XY,其中X排在前面的个数大于等Y问题)这三个问题是等价的
一个有n个X和n个Y组成的字串,且所有的部分字串皆满足X的个数大于等于Y的个数。以下为长度为6的dyck words:
XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY
将上例的X换成左括号,Y换成右括号,Cn表示所有包含n组括号的合法运算式的个数:
((())) ()(()) ()()() (())() (()())
这些问题都可以归并为进出栈问题来解答,假设有nnn个5元的人,先排号队1到n那么选取第k个人最后一个出栈那个前面有f(k)f(k)f(k)和后面的f(n−k)f(n-k)f(n−k)种方法,而这个k又可以从1到n$中选取,因此有卡特兰数种。