卡特兰数

题目1:

矩阵的乘法添加括号我们知道,A*B可以,但是并不表示B*A也可以。假设有N+1个矩阵相乘,不能交换次序。只能用添加括号的方法来修改乘积的次序。那么有多少种添加括号的方法。

H(n)种。

 

题目2:

出栈次序问题,一个栈,其进栈的序列是从1~n,那么有多少种不同的出栈序列。

解:n 个元素进栈和出栈,总共要经历 n 次进栈和 n 次出栈。这就相当于对这 2n 步操作进行排列。

那么模型如下:对角线将以n*n正方形网格分成两部分,只留下包含对角线在内的下半部分。由于只能向右走和向下走,可以把向右走认为是在出栈,那么从左上角走到右下角,只需要H(n)步。因为只需要选择,在哪些地方向走右罢了。而总共肯定是需要向右走n步的。

 

题目3:

2n个人入场,n个人身上有10块,n个人身上有5块。票价是5块。那么如果要保证一直可以找零,那么入场的次序有多少种?

当有10块的人入场的时候,可以把他们看成是出栈,而5块的人入场当成入栈。则问题变得与出栈次序一样了。

 

题目4:

把1和0组合成一个序列,1的数目与0的数目都是一样的,为n个。有多少种排序使得从左向右扫描的时候,1的数目一直对0保持优势?

H(n)

 

题目5:

对于多边形三角形切分的时候,有多少种切分方法。

再如在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数

#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;

int a[105][105];    //大数卡特兰数
int b[105];         //卡特兰数的长度

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

int main()
{
    int i, n;
    catalan();
    while(scanf("%d", &n) != EOF)
    {
        for(i = b[n]-1; i>=0; i--)
        {
            printf("%d", a[n][i]);
        }
        printf("\n");
    }

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值