卡特兰数问题

卡特兰数

  • 卡特兰数
    卡特兰数是组合数学中一个常出现在各种计数问题中的数列,最早由清代数学家明安图发现,也叫“明安图数”
    1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012 ...
    一般通项公式为
    Cn=1n+1(2nn)=(2n)!(n+1)!n! C n = 1 n + 1 ( 2 n n ) = ( 2 n ) ! ( n + 1 ) ! n !

    h(0)=1,h(1)=1 h ( 0 ) = 1 , h ( 1 ) = 1 , catalan数满足递推式
    h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)h(0)(n>=2) h ( n ) = h ( 0 ) ⋅ h ( n − 1 ) + h ( 1 ) ⋅ h ( n − 2 ) + . . . + h ( n − 1 ) ⋅ h ( 0 ) ( n >= 2 )
  • 常见应用

    1. 括号化
      矩阵连乘: P=a1×a2×a3××an P = a 1 × a 2 × a 3 × … … × a n ,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?
    2. 出栈次序
      一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
    3. 凸多边形三角划分
      这里写图片描述
      在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数?
    4. 给定节点组成二叉搜索树
      给定N个节点,能构成多少种不同的二叉搜索树?
    5. n n 对括号正确匹配数目
      给定 n 对括号,求括号正确配对的字符串数,例如:
      0对括号:[空序列] 1种可能
      1对括号: () ( ) 1种可能
      2对括号: ()()(()) ( ) ( ) ( ( ) ) 2种可能
      3对括号: ((()))()(())()()()(())()(()()) ( ( ( ) ) ) ( ) ( ( ) ) ( ) ( ) ( ) ( ( ) ) ( ) ( ( ) ( ) ) 5种可能
      那么问题来了,n对括号有多少种正确配对的可能呢?
      考虑 n n 对括号时的任意一种配对方案,最后一个右括号有唯一的与之匹配的左括号,
      于是有唯一的表示A(B),其中A和B也是合法的括号匹配序列。
      假设 S(n) n n 对括号的正确配对数目,
      那么有递推关系 S(n)=S(0)S(n1)+S(1)S(n2)+...+S(n1)S(0),显然 S(n) S ( n ) 是卡特兰数。
  • 计算卡特兰数 一般算法:

public class Catalan {
    public static void main(String[] args){
        System.out.println(generateCatalan(3));
    }

    public static long generateCatalan(int n) {
        //产生卡特兰数
        long[] catalan = new long[n + 1];
        catalan[0] = 1L;
        catalan[1] = 1L;
        for(int i = 2;i <= n; i++){
            for(int j = 0; j < i; j++){
                catalan[i] += catalan[j] * catalan[i-j-1];
            }
        }
        return catalan[n];
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值