1.卡特兰数
前几项为:1, 1, 2, 5, 14, 42, 132,
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)
h(n)=h(n-1)*(4*n-2)/(n+1);
h(n)=C(2n,n)/(n+1) (n=0,1,2,...)
h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)
常见问法:(一般就是根据后一个动作发生必须保证前面有动作发生才可以,就像必须有入栈的才可以出栈)
典型的是入栈出栈问题,火车进栈
排队:两排 第二排要比第一排高,第一排可以看成0第二排看成1那么就是求满足条件的01序列有多少
括号化问题,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案
多边形划分为三角形,(类似:在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数)
给定节点组成二叉树的问题
2.默慈金数
Mn+1=(2n+3)Mn+3nMn-1/(n+3)
Mn=C(2i,n)* catalan(i)(i=0,1.....n/2)
圆上的个点间,画出彼此不相交弦的全部方法的总数
方格移动:走法移动步从到的可能形成的路径的总数为的默慈金数
代码实现:
import java.math.BigInteger; import java.util.Scanner; public class Main { static BigInteger num[]=new BigInteger[10005]; public static void main(String[] args) { // TODO Auto-generated method stub Scanner cin =new Scanner(System.in); BigInteger m=BigInteger.TEN.pow(100); num[1]=new BigInteger("1"); num[2]=new BigInteger("2"); for(int i=2;i<=10000;i++) { long a=(2*i+3); long b=(3*i); long c=(i+3); num[i+1]=((new BigInteger(""+a).multiply(num[i])).add(new BigInteger (""+b).multiply(num[i-1])).divide(new BigInteger(""+c))); } while(cin.hasNext()) { int n; n =cin.nextInt(); System.out.println(num[n].mod(m)); } } }