zoukankan      html  css  js  c++  java
  • 卡特兰数

    卡特兰数又称卡塔兰数,英文名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, ...
    卡特兰数Cn满足以下递推关系[1]  :
     

    原理

    编辑
    令h(0)=1,h(1)=1,catalan数满足递推式[2]  :
    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
    另类递推式[3]  :
    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,...)
     

    应用

    编辑
    实质上都是递推等式的应用
     

    1.括号化

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

    2.出栈次序

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

    3.凸多边形三角划分

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

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

    给定N个节点,能构成多少种不同的二叉搜索树
    (能构成h(N)个)
    (这个公式的下标是从h(0)=1开始的)
     

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

    给定n对括号,求括号正确配对的字符串数,例如:
    1对括号:() 1种可能
    2对括号:()() (()) 2种可能
    3对括号:((())) ()(()) ()()() (())() (()()) 5种可能
    那么问题来了,n对括号有多少种正确配对的可能呢?
    实际上假设S(n)为n对括号的正确配对数目,那么有递推关系S(n)=S(1)S(n)+S(2)S(n-1) +...+S(n)S(1),显然S(n)是一个卡特兰数。

     简单实现:
    #include "stdio.h"
    #define LL long long
    LL h[1005];
    void f()
    {
        h[1]=1;
        for(LL i=2;i<1005;i++)
        {
            h[i]=h[i-1]*(4*i-2)/(i+1);
        }
    }
    int main()
    {
        f();
        LL n;
        while(~scanf("%lld",&n))
        {
            printf("%lld
    ",h[n]);
        }
    }

     HDU1023对应应用2,与大数结合

    import java.math.BigInteger;
    import java.util.Scanner;
    
    public class Main {
        static BigInteger[] h=new BigInteger[105];
        static void catalan(){
            h[0]=BigInteger.ONE;
            h[1]=BigInteger.ONE;
            for(int i=2;i<105;i++){
                h[i]=h[i-1].multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1));
            }
        }
        public static void main(String[] args) {
            int n;
            @SuppressWarnings("resource")
            Scanner cin=new Scanner(System.in);
            catalan();
            while(cin.hasNext()){
                n=cin.nextInt();
                System.out.println(h[n]);
            }
        }
    }

    h(100)=896519947090131496687170070074100632420837521538745909320

     Catalan三角形是这样的一个三角形,它的每个元素都是其上面的元素与其左边元素的和.Catalan三角形每一行最后一个元素是前一行元素的和.
    Catalan三角形数,输入一个行号n,输出n-1行的Catalan三角形.

    1
    1 1
    1 2 2
    1 3 5 5
    1 4 9 14 14
    1 5 14 28 42 42
    1 6 20 48 90 132 132

  • 相关阅读:
    图像检索(image retrieval)- 11
    图像检索(image retrieval)- 10相关
    Mock.js简易教程,脱离后端独立开发,实现增删改查功能
    Azure Monitor (3) 对虚拟机磁盘设置自定义监控
    Azure Monitor (1) 概述
    Azure SQL Managed Instance (2) 备份SQL MI
    Azure Virtual Network (17) Private Link演示
    Azure Virtual Network (16) Private Link
    Azure Virtual Network (15) Service Endpoint演示
    Azure Virtual Network (14) Service Endpoint服务终结点
  • 原文地址:https://www.cnblogs.com/kimsimple/p/7070165.html
Copyright © 2011-2022 走看看