hdu1023-----卡特兰数

原题链接点这里

这道题就是卡特兰数+大数

卡特兰数的两种解法

一、令h(0)=1,h(1)=1,catalan数满足递推式 :

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);

卡特兰数的应用

1、括号化

矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)

2、出栈次序

扫描二维码关注公众号,回复: 2557335 查看本文章

一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列

3、凸多边形三角划分

在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)

4、给定节点组成二叉搜索树

给定N个节点,能构成多少种不同的二叉搜索树

(能构成h(N)个)注意(这个公式的下标是从h(0)=1开始的)

5、n对括号正确匹配数目

给定n对括号,求括号正确配对的字符串数

                                                      -------------------------摘自百度百科

下面给出这道题的代码  因为数字很大  所以用的java

顺便提一下 java创建数组的方法

int[] arr=new int[6];//

BigInteger a[]=new BigInteger[107];

hdu1023 代码

import java.io.*;
import java.math.*;
import java.util.*;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin=new Scanner(System.in);
		BigInteger a[]=new BigInteger[107];
		s[1]=BigInteger.ONE;
		for(int i=2;i<105;i++){
			a[i]=a[i-1].multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1));
		}
		while(cin.hasNext()){
			int n=cin.nextInt();
			System.out.println(a[n]);
		}
		cin.close();
	}

}

猜你喜欢

转载自blog.csdn.net/holly_Z_P_F/article/details/81291827