C - Train Problem II HDU - 1023 (有趣的卡特兰数)

卡特兰数第一道题科普一下卡特兰数先;
卡特兰数的维基百科:https://zh.wikipedia.org/wiki/卡塔兰数
1-100的卡特兰数:http://blog.youkuaiyun.com/lttree/article/details/29392541
简单来讲卡特兰数就是
在这里插入图片描述
在这里插入图片描述
递推式cn=cn-1*(4*n-2)/(n+1);
常见应用:具体看维基百科,我的理解就是由两个相同数量的东西匹配而其中一个从前遍历一定比后面得多
1.栈的出入有多少的出去顺序。
2.dyck word数
3.合法运算式数
4.n个节点组成不同构二叉树的方案数
5.在n × n格点中不越过对角线的单调路径的个数
6.连结顶点而将n + 2边的凸多边形分成三角形的方法个数
7.Cn表示表为2×n的矩阵的标准杨氏矩阵的数量。 也就是说,它是数字 1, 2, …, 2n 被放置在一个2×n的矩形中并保证每行每列的数字升序排列的方案数。
给个例题:C - Train Problem II HDU - 1023
链接:https://vjudge.net/contest/295931#problem/C
java实现
javatqlhttps://blog.youkuaiyun.com/qq_27599517/article/details/51027296
c++实现
将数字i的各个位数放在数组里然后乘除即可

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 105;
int a[MAXN][MAXN];
///可以作为模板
void Catalan()
{
    int len=1,yushu=0;
    a[1][0]=1;
    a[1][1]=1;
    for(int i=2/*1*/;i<MAXN;i++){
        yushu=0;/**/
        for(int j=1;j<=len;j++)
        {
            int k=a[i-1][j]*(4*i-2)+yushu;
            a[i][j]=k%10;yushu=k/10;
        }
        while(yushu)
        {a[i][++len]=yushu%10;
        yushu/=10;}
        for(int j=len;j>=1;j--)
        {
            int k=a[i][j]+yushu*10;
            a[i][j]=k/(i+1)/*10*/;
            yushu=k%(i+1);
        }
        while(!a[i][len])
            len--;
        a[i][0]=len;
    }
}
int main()
{
    Catalan();
    int n;
    while(cin>>n)
    {
        for(int i=a[n][0]; i>0; i--)
            cout<<a[n][i];
        cout<<endl;
    }
    return 0;
}

优秀的题解https://blog.youkuaiyun.com/qingshui23/article/details/51001054

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值