1.描述
2.原理
3. 运用:
(1) ,出栈次序不同的个数
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
(2),给定节点计算组成二叉树个数
给定N个节点,能构成多少种不同的二叉树?
(3),凸多边形三角划分个数
在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6 时,f(6)=14。
(4)括号化
矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n-1)种)
代码:
import java.math.BigInteger;
import java.util.Scanner;
public class hdu_1023Train_Problem_II {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
BigInteger [] a = new BigInteger [101];
a[1]=new BigInteger("1");
a[2]= new BigInteger("2");
a[3]= new BigInteger("5");
for(int i=4; i<=100; i++){//h(n)=h(n-1)*(4*n-2)/(n+1);
a[i] = a[i-1].multiply(BigInteger.valueOf((4*i-2))).divide(BigInteger.valueOf(i+1));
System.out.println(a[i]);
}
while(sc.hasNext()){
int n = sc.nextInt();
System.out.println(a[n]);
}
}
}
//转载:http://blog.csdn.net/jtlyuan/article/details/7440591
卡特兰数:规定C0=1,而C1=1,C2=2,C3=5,C4=14,C5=42,C6=132,C7=429,C8=1430,C9=4862,C10=16796,
C11=58786,C12=208012,C13=742900,C14=2674440,C15=9694845·········································
卡塔兰数的一般项公式为 另类递归式: h(n)=((4*n-2)/(n+1))*h(n-1);
Cn的另一个表达形式为h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2)
hai可以这样推导出来:
n |
推到过程 |
Cn |
1 |
1 |
1 |
2 |
1 1 |
2 |
3 |
1 2 2 |
5 |
4 |
1 3 5 5 |
14 |
5 |
1 4 9 14 14 |
42 |
6 |
1 5 14 28 42 42 |
132 |
7 |
1 6 20 48 90 132 132 |
429 |
··· |
··· ··· |
··· |
所以,在做题的时候,我们应该用上面的公式Cn=Ck*Cn-k (k=1,2``n)来判断是否使用于katalan数来解决问题,合适就列出前几项来判断推到出答案
总结了一下,最典型的四类应用:(实质上却都一样,无非是递归等式的应用,就看你能不能分解问题写出递归式了)
1.括号化问题。
矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)
2.出栈次序问题。
一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?
类似:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
3.将多边行划分为三角形问题。
将一个凸N+2多边形区域分成三角形区域的方法数?
类似:一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她
从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
类似:在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
4.给顶节点组成二叉树的问题。
给定N个节点,能构成多少种不同的二叉树?
(能构成h(N)个)
Catalan数的解法
Catalan数的组合公式为 Cn=C(2n,n) / (n+1);
此数的递归公式为 h(n ) = h(n-1)*(4*n-2) / (n+1)
卡特兰数真是一个神奇的数字,很多组合问题的数量都和它有关系,例如:
Cn= n对括号正确匹配组成的字符串数,例如 3对括号能够组成:
((())) ()(()) ()()() (())() (()())
Cn= n+1个数相乘,所有的括号方案数。例如, 4个数相乘的括号方案为:
((ab)c)d (a(bc))d (ab)(cd) a((bc)d) a(b(cd))
Cn= 拥有 n+1 个叶子节点的二叉树的数量。例如 4个叶子节点的所有二叉树形态:
下面是一些大公司的笔试题
先来一道阿里巴巴的笔试题目:说16个人按顺序去买烧饼,其中8个人每人身上只有一张5块钱,另外8个人每人身上只有一张10块钱。烧饼5块一个,开始时烧饼店老板身上没有钱。16个顾客互相不通气,每人只买一个。问这16个人共有多少种排列方法能避免找不开钱的情况出现。
C8=1430,所以总数=1430*8!*8!
2012腾讯实习招聘笔试题
在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,图书馆此时没有了面试宝典了,求他们排队的总数?
C3=5;所以总数为5*3!*3!=180.