欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Safe Salutations UVA - 991(卡特兰数)

程序员文章站 2022-04-02 19:00:27
...

题目链接: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;
}