Safe Salutations UVA - 991(卡特兰数)

题目链接:Safe Salutations UVA - 991

题目大意:圆上有2n个点,将这2n个点成对相连后,要求所连线段都不重合,求有多少种连接的方法。

卡特兰数的几种典型应用:

1、 括号化问题。

n个左括号和n个右括号组成的合法括号序列的数量?

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

2、 出栈次序问题。

1,2,……,n经过一个栈,形成的合法出栈序列的数量?

类似:在n*n的格子中,只在下(上)三角行走,每次横或竖走一格,有多少中走法?(向右走相当于入栈,向左走相当于出栈)

类似:2n个人进入剧场。入场费5元。其中n个人只有一张5元钞票,另外n人只有一张10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

3、将多边行划分为三角形问题。

一个凸的n边形,用直线连接两个顶点使之分成多个三角形,每条直线不能相交,问一共有多少种划分方案。

类似:圆上有2n个点,将这2n个点成对相连,且所连线段都不重合,求有多少种连接的方法?

4.给定节点组成二叉树的问题。

n个节点构成的不同二叉树的数量

先取一个点作为根节点,然后其左侧依次可以取0至n-1个,右侧对应为n-1到0个,两两配对相乘,即h(0)*h(n-1) + h(2)*h(n-2) +…+
h(n-1)h(0)=h(n)刚好符合卡特兰数的递推关系。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N=10;

int c[N+1];

int main()
{
    c[0]=1;
    for(int i=1;i<=N;i++)
        c[i]=c[i-1]*(4*i-2)/(i+1);

    int n,flag=0;
    while(~scanf("%d",&n))
    {
        if(flag)
            printf("\n");
        flag=1;

        printf("%d\n",c[n]);
    }

    return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值