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

原文地址:https://www.cnblogs.com/harrygogo/p/4568752.html