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