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)
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
大意: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到达它的上方,共有几种走法?
(图一,画一条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)