Catalan数及其应用
1. 定义
卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 :
1, 2, 5, 14, 42, 132...
递推式:
令h(0)=1,h(1)=1,
(1) Catalan数满足递推式:
h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)
e.g., h(2) = h(0)*h(1) + h(1)*h(0) = 2.
(2) h(n) = h(n-1)*(4*n-2)/(n+1)
(3) h(n)=C(2n,n)/(n+1) (n=0,1,2,...)
(4) h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)
2. 应用
(1) 括号化
矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案? h(n-1)种
(2) 出栈次序 一个栈(容量无穷大)的进栈序列为1,2,3,4...,n,问有多少种不同的出栈序列? h(n)种
分析:
首先,我们设f(n)=序列个数为n的出栈序列种数。
我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立的(最后出栈的元素不同则整个序列也不同),也就是求出每种k最后出栈的情况数后可用加法原则,由于k最后出栈,因此,在k入栈之前,比k小的值均出栈,此处情况有f(k-1)种,而之后比k大的值入栈,且都在k之前出栈,因此有f(n-k)种方式,由于比k小和比k大的值入栈出栈情况是相互独立的,此处可用乘法原则,f(n-k)*f(k-1)种,求和便是Catalan递归式。
延伸:
类似问题:买票找零
有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?
(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
h(n)种
(3) 凸多边形三角划分
在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6时,f(6)=14。
延伸:
类似问题
一位大城市的律师,在她住所的以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
圆桌周围有 2n个人,他们两两握手,但没有交叉的方案数。
(4) 给定节点组成二叉树
给定N个节点,能构成多少种不同的二叉树?(能构成h(N)个, 从h(0)=1开始)
Unique Binary Search Trees
Given n, how many structurally unique BST's (binary search trees) that store values 1...n?
For example,
Given n = 3, there are a total of 5 unique BST's.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
程序
public class Solution { public int numTrees(int n) { if (n < 0) { return 0; } // 辅助数组 int[] dp = new int[n + 1]; // 初始化 dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++) { for (int j = 0; j < i; j++) { // f(n) = sum(f(i) * f(n - 1 - i)), i = 0 到 n - 1 dp[i] += dp[j] * dp[i - j - 1]; } } return dp[n]; } }
下面是一些大公司的笔试题
先来一道阿里巴巴的笔试题目:说16个人按顺序去买烧饼,其中8个人每人身上只有一张5块钱,另外8个人每人身上只有一张10块钱。烧饼5块一个,开始时烧饼店老板身上没有钱。16个顾客互相不通气,每人只买一个。问这16个人共有多少种排列方法能避免找不开钱的情况出现。
C8=1430,所以总数=1430*8!*8!
2012腾讯实习招聘笔试题
在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,图书馆此时没有了面试宝典了,求他们排队的总数?
C3=5;所以总数为5*3!*3!=180.
参考资料
http://blog.csdn.net/jtlyuan/article/details/7440591