组合数学及其应用——卡特兰数

卡特兰数是组合数学中常见也是重要的特殊计数公式。

首先给出一个现实问题的模型:

给出凸多边形的边数n,求解该凸多边形内部不相交的对角线把这个区域分成三角形区域的方法数。

首先我们进行初步的分析,当n=2,h2=1,也就是说对于三角形,划分的情况数是1.这似乎有些不好理解,由于三角形内部无法添加对角线,所以符合情况的就是三角形本身,情况数为1.

下面我们讨论n取任意值的情况。

看下面的图。

考虑将n+1凸边形的子问题,即我们将AB视为基边,枚举C的位置,有n-1个可枚举位置,然后结合基本的计数原理,我们能够看到下面的递推式能够不重不漏的表示出h[n].

而现在的问题在于,这样的递推公式是我们不喜爱的,我们喜欢的形式是斐波那契数列,给出的是前后项的关系式然后我们可以在线性时间复杂度下求出该数列,那么下面我们需要讨论的便是如何得到这个递推公式的解。

下面是根据这条结论计算卡特兰数列的JAVA代码:

import java.io.*;
import java.util.*;
import java.math.BigInteger;

public class Main
{
 public static void main(String args[])
 {
  BigInteger[] a = new BigInteger[101];
  a[0] = BigInteger.ZERO;
  a[1] = BigInteger.valueOf(1);
  for(int i = 2; i <= 100; ++i)
   a[i] = a[i - 1].multiply(BigInteger.valueOf(4 * i - 2)).divide(BigInteger.valueOf(i+1));
   Scanner in = new Scanner(System.in);
   int n;
   while(in.hasNext())
   {
    n = in.nextInt();
    System.out.println(a[n]);
   }
 }
}
时间: 2024-12-20 18:21:55

组合数学及其应用——卡特兰数的相关文章

uva 1478 - Delta Wave(递推+大数+卡特兰数+组合数学)

题目链接:uva 1478 - Delta Wave 题目大意:对于每个位置来说,可以向上,水平,向下,坐标不能位负,每次上下移动最多为1, 给定n问说有多少种不同的图.结果对10100取模. 解题思路:因为最后都要落回y=0的位置,所以上升的次数和下降的次数是相同的,并且上升下降的关系满足出栈入栈的关系.即卡特兰数. 所以每次枚举i,表示有i个上升,i个下降,用组合数学枚举出位置,然后累加求和. C(2?in)?f(i)=C(2?i?2n)?f(i?1)?(n?2?i+1)?(n?2?i+2)

CodeForces - 1204E Natasha, Sasha and the Prefix Sums (组合数学,卡特兰数扩展)

题意:求n个1,m个-1组成的所有序列中,最大前缀之和. 首先引出这样一个问题:使用n个左括号和m个右括号,组成的合法的括号匹配(每个右括号都有对应的左括号和它匹配)的数目是多少? 1.当n=m时,显然答案为卡特兰数$C_{2n}^{n}-C_{2n}^{n+1}$ 2.当n<m时,无论如何都不合法,答案为0 3.当n>m时,答案为$C_{n+m}^{n}-C_{n+m}^{n+1}$,这是一个推论,证明过程有点抽象,方法是把不合法的方案数等价于从(-2,0)移动到(n+m,n-m)的方案数,

hdu 2067 小兔的棋盘(组合数学 卡特兰数)

卡特兰数又称卡塔兰数,英文名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

组合数学--卡特兰数-持续更新

参考资料: 基本介绍和各种分类 http://www.cnblogs.com/topW2W/p/5410875.html 另类递归式: h(n)=h(n-1)*(4*n-2)/(n+1);  (从n开始,更常用) 前几个卡特兰数:规定C0=1,而 分类 :  括号,栈,矩阵乘法,     凸多边形划分,二叉搜索树构造      步数上下,找零, C1=1,C2=2,C3=5,C4=14,C5=42, C6=132,C7=429,C8=1430,C9=4862,C10=16796, C11=587

hdu5673 Robot 卡特兰数+组合数学+线性筛逆元

Robot Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 483    Accepted Submission(s): 244 Problem Description There is a robot on the origin point of an axis.Every second, the robot can move rig

NPU 2015年陕西省程序设计竞赛网络预赛(正式赛)F题 和谐的比赛(递推 ||卡特兰数(转化成01字符串))

Description 今天西工大举办了一场比赛总共有m+n人,但是有m人比较懒没带电脑,另外的n个人带了电脑.不幸的是,今天机房的电脑全坏了只能用带的电脑,一台电脑最多两人公用,确保n>=m.但是大家来的时间不同,随机次序来机房,带电脑的人直接准备比赛而没带电脑的人需要向带电脑并还没和别人公用的人求助(当然会答应).但是,如果不存在带电脑并还没和别人公用的人,那他就要等了,等是很让人头疼的,这就不和谐了,当然假如没有这样的情况发生比赛是很和谐的. Input 输入多组数据,每组数据只有一行m(

卡特兰数(Catalan)

卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796. 通项:f(n) = f(0)*f(n-1) + f(1)*f(n-2) + .......+ f(n-2)*f(1) + f(n-1)*f(0) n>=2 f(n)=f(n-1)*(4n-2)/(n+1) 应用场景:

POJ 2084 Game of Connections(卡特兰数)

卡特兰数源于组合数学,ACM中比较具体的使用例子有,1括号匹配的种数.2在栈中的自然数出栈的种数.3求多边形内三角形的个数.4,n个数围城圆圈,找不相交线段的个数.5给定n个数,求组成二叉树的种数…… 此题就是第4个样例,是裸卡特兰数,但是这里牵扯的大数,可以使用java的大数类解决,但是我这里使用高精度乘法和除法模拟的(主要是java不会). 此处的递推式为H[1] = 1:H[n] = H[n-1]*(4*n-2)/(n+1){n>=2}:代码如下: 需要注意输出的形式,我这里的进制是100

卡特兰数大数相乘

计算1-100卡特兰数,必须要用数组存,大数模板 注:卡特兰数:卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名.原理: 令h(1)=1,h(0)=1,catalan数满足递归式: h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2) 另类递归式: h(n)=((4*n-2)/(n+1))*h(n-1); 该递推关系的解为: h(n)=C(2n,n