catalan数

catalan数是组合数学中计算问题的一种数列。
设h(0)=h(1)=1,它满足递推式:
h(n)=h(0)h(n-1)+h(1)h(n-2)+……+h(n-1)h(0)  (n>=2)
另类递归式:
通项公式(解):   (n=1,2,3……)

相关问题:
hdu 1023 Train Problem II
http://acm.hdu.edu.cn/showproblem.php?pid=1023
大意:N个火车按编号升序进站,问出栈的序列个数。
分析:设出栈的方案数是h(n)。这样设想,最后一辆火车在n-1辆火车出来后只有它自己,出来的情况数是1,讨论那n-1辆火车。把n-1辆火车出来的情况看做一个整体,即h(0)h(n-1),把n-1辆火车分成1+n-2,出来的情况是h(1)h(n-2),这样说来还可以把n-1辆火车分成h(2)h(n-3)……分成h(n-1)h(0)。即catalan数。
N可以达到100,由解的表达式可以知道,这涉及到大数。
import java.math.BigInteger;
import java.util.*;
public class Main {
    public static BigInteger get(int n){
        BigInteger ans=BigInteger.ONE;
        while(n>0){
            ans=ans.multiply(BigInteger.valueOf(n));
            n--;
        }
        return ans;
    }
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int n;
        while(cin.hasNext()){
            n=cin.nextInt();
            BigInteger p1=get(2 * n);
            BigInteger p2=get(n);
            BigInteger p3=p2.multiply(BigInteger.valueOf(n + 1));
            System.out.println(p1.divide(p2).divide(p3));
        }
    }
}
以此题为背景,阅读了一下其他资料,理解了通项公式(解)的由来:
参考资料:

殊途同归--catalan数的几种解法 

浙江省镇海中学 贺洪鸣

例1: 

在平面直角坐标线中,从(0,0)点走到(n,n)点,规定只能向上或向右走,且不能穿过直线y=x到达它的上方,共有几种走法? 

  catalan数_第1张图片

  

(图一,画一条Y-X的分界线限定组合情况Y不能大于X,这是本质!即相当于火车出站出栈的个数不能大于入站的个数)

解:

如图1所示,从A(0,0)点出发至B(n,n)点,不穿过直线y=x的走法数,等于从A点出发至B点的总走法数,减去从A点出发至B点并穿过直线y=x的走法数。 

从A点出发至B点的总走法数,相当于从2n步的决策中,任选n个向上的方案数,它等于C(2n,n)

对于每一个从A点出发至B点并穿过直线y=x的走法,必然存在第一次穿过直线y=x从而到达直线y=x+1中的点P,我们将从A至P的路径沿直线y=x+1对称反转,得到一条从A’(-1,1)至B的路径。 

对于每一个从A’至B的走法,必然会到达直线y=x+1,我们找到第一次到达直线y=x+1时的点P,将A’至P的路径沿直线y=x+1对称反转,得到一条从A出发穿过直线y=x到达点B的路径。 

因此,每一条从A至B且穿过直线y=x的路径,一一对应着一条从A’出发至B的路径。这种路径数相当于从2n步决策中,选择任意的n-1步向上走,走法数为C(2n,n-1)

   综上所述,从A至B不穿过直线y=x的走法数C(2n,n)-C(2n,n-1)=C(2n,n)/(n+1)



你可能感兴趣的:(Catalan)