Catalan number(POJ:2084)
来源:互联网 发布:c并发编程实现 编辑:程序博客网 时间:2024/05/22 11:48
Description
- 卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名,其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …
原理
令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(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
另类递推式:
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,…)
应用
- 括号化:
矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种) - 出栈次序
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列? - 凸多边形三角划分
在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6时,f(6)=14。 - 给定节点组成二叉搜索树
给定N个节点,能构成多少种不同的二叉搜索树? - n对括号正确匹配数目
给定n对括号,求括号正确配对的字符串数 - 类似问题
1.一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
2.在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
Java实现
package catalan;import java.util.*; import java.math.BigInteger;public class catalan{ //求卡特兰数 public static void main(String[] args){ int numberOfCatalan = 101; //要求多少个卡特兰数 BigInteger[] digis = new BigInteger[numberOfCatalan+1]; //大数数组:存储对应的卡特兰数 BigInteger x=new BigInteger("1"); //第一个卡特兰数为1 digis[0]=x; digis[1]=x; int y=0; int z=0; for(int counter=2; counter<=numberOfCatalan; ++counter){ y=4*counter-2; z=counter + 1; digis[counter]=digis[counter-1].multiply(new BigInteger("" + y)); digis[counter]=digis[counter].divide(new BigInteger("" + z)); } Scanner scanner = new Scanner(System.in); //输入所求的卡特兰数h(n) int number; while(true) { number = scanner.nextInt(); if(number == -1) break; String answer = digis[number].toString(); //按字符串输出 System.out.println(answer); } } }
C++实现
void catalan() //求卡特兰数{ int i, j, len, carry, temp; a[1][0] = b[1] = 1; len = 1; for(i = 2; i <= 100; i++) { for(j = 0; j < len; j++) //乘法 a[i][j] = a[i-1][j]*(4*(i-1)+2); carry = 0; for(j = 0; j < len; j++) //处理相乘结果 { temp = a[i][j] + carry; a[i][j] = temp % 10; carry = temp / 10; } while(carry) //进位处理 { a[i][len++] = carry % 10; carry /= 10; } carry = 0; for(j = len-1; j >= 0; j--) //除法 { temp = carry*10 + a[i][j]; a[i][j] = temp/(i+1); carry = temp%(i+1); } while(!a[i][len-1]) //高位零处理 len --; b[i] = len; }}
阅读全文
0 0
- Catalan number(POJ:2084)
- POJ 2084 (Catalan数)
- poj 2084 Catalan数
- Catalan number
- Catalan Number
- Catalan number
- POJ 2084 Catalan数+高精度
- poj 1095 递归(Catalan)
- POJ-2084(Catalan数专题)(Game of Connections )
- poj 2084/3982 java大数(Catalan数)
- 卡特兰数(Catalan number)
- Training:卡特兰数(Catalan number)
- Catalan number (卡兰特数)
- 卡塔兰数 Catalan Number
- hdu 题目1134 Game of Connections (卡塔兰数 catalan number)
- 程序员数学--卡特兰数(Catalan number)
- 程序员数学--卡特兰数(Catalan number)
- 程序员数学之卡特兰数(catalan number)
- Navicat 连不上mysql数据库 问题及解决法
- 关于g++(gcc)编译c/c++的学习笔记
- SpringMVC
- redis设计与实现(二)链表
- 使用comparator 将对象数组进行排序
- Catalan number(POJ:2084)
- 装饰者模式的简单实现
- 验证信息是否包含数字两种方法任你选!!!
- [面试经验]南大校招cocos2d-x方向(含C++)面试题
- 怎么理解vue的数据双向绑定
- 关于并发和并行的区别
- android framework层是用于开发什么
- [C++]全面理解C++中的引用
- [hihoCoder]#1615 : 矩阵游戏II