美文网首页
卡特兰数

卡特兰数

作者: Vincy_ivy | 来源:发表于2019-05-04 22:46 被阅读0次

CGY杯

火车出站(卡特兰数)

Problem Description
CGY管理着一个火车站的调度问题,这个车站有个中转站,可以停靠任意多节的火车,但末端封顶,驶入中转站的火车必须按照相反的顺序驶出。现在有N节火车,编号为1~N,这些火车按照1,2,3…N的顺序进站。CGY每天看着这些火车真的很无聊,他现在在想这些火车会有多少种出站顺序。
Input
输入的第一行是一个整数T,表示有T(1≤T≤100)组数据
接下来包含T行,每行一个整数N(1≤N≤35),表示火车的节数。
Output
输出T行,每行一个整数,表示可能的出站顺序

Sample Input
3
1
2
3

Sample Output
1
2
5

解释

卡特兰数的一般公式
卡特兰数满足以下性质:
令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(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,...)。这个公式还可以更简单得化为h(n)=C(2n,n)/(n+1)。后一个公式都可以通过前一个公式经过几步简单的演算得来,大家可以拿起笔试试,一两分钟就可以搞定。

模板

f[0]=f[1]=1;
for(int i=2;i<=n;i++)
    for(int j=0;j<i;j++)
        f[i]+=f[j]*f[i-j-1];

注意

卡特兰数第35项刚好比long long小一点,但用不同的递推式中途数据long long可能会爆掉.

代码

#include <bits/stdc++.h>
using namespace std;
long long int d[36];

void checked(){
 d[0]=d[1]=1;
    for(int i=2;i<=35;i++)
        for(int j=0;j<i;j++){
            d[i]+=d[j]*d[i-j-1];
        }
}

int main(){
    int T,n;
    checked();
    cin>>T;
    while(T--){
        scanf("%d",&n);
        printf("%lld\n",d[n]);
    }
    return 0;
}

相关文章

  • Golang 实现卡特兰数

    Golang 实现卡特兰数 卡特兰数又称卡塔兰数,卡特兰数是组合数学中一个常出现在各种计数问题中的数列。前20项为...

  • 卡特兰数:hdu-2067 小兔的棋盘&&火车出栈问题

    卡特兰数,一串神奇的数字,1,2,5,14...... 首先了解一下卡特兰数. 卡特兰数(好像很有用的说) - C...

  • AVL

    LOG(n) 卡特兰数 叉姐

  • 数学 | 卡特兰数

    卡特兰数 定义 卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出...

  • 卡特兰数

  • 卡特兰数

    之前看算法导论时,讲了给定几个数字,能构造出几种二叉树,当时只想到排列组合的解决方法,极其复杂又不好记,过段时间还...

  • 卡特兰数

    https://zhuanlan.zhihu.com/p/31317307 火车进出栈问题和腾讯那道猜拳游戏是一样...

  • 卡特兰数

    卡特兰数是一种经典的组合数,经常出现在各种计算中,其前几项为 :1, 2, 5, 14, 42,132, 429,...

  • 卡特兰数

    名字来源比利时数学家卡塔兰。卡塔兰:Catalan 数列满足 通项: 给定n个节点,能构成的二叉搜索树个数为Cn。...

  • 卡特兰数

    题:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?解:...

网友评论

      本文标题:卡特兰数

      本文链接:https://www.haomeiwen.com/subject/iotonqtx.html