卡特兰数及括号正确匹配个数问题解释


给定n对括弧,求出这些括号可以正确配对的总数

举例

例如输入的数据是1,可以正确配对的方法是(),所以是输出1;

如果输入的数据是2,可以正确配对的方法是()(),(()),所以输出的是2;

如果输入的数据是3,可以正确配对的方法是()()(),(())(),()(()),((())),(()())所以输出的是5;

公式:卡特兰数有固定的解法公式,以后碰到可以直接用公式来求解。

h(n)=h(n-1)*(4*n-2)/(n+1);

#include 

int catalan(int i)
{
   if(i == 0)
   {
      return 1;
   }
   return (i * 4 - 2) * catalan(i - 1)/(i + 1);
}
int  main()
{
    int i ;
	scanf("%d",&i);
    printf("输入%d 有%d种方法\n", i,catalan(i));
	getchar();
	getchar();
    return 0;
}

 

常见卡特兰数应用:

(1)一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列

(2)买票找零:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?

(3) 

凸多边形三角划分:在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6时,f(6)=14。

(4)道路选择问题:一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?

 

 

卡特兰数 - lz_666888 - lz_666888的博客

 

(5)长度为 2n的 Dyck words的数量。 Dyck words是由 n个 X和 n个 Y组成的字符串,并且从左往右数, Y的数量不超过 X。

(6) 拥有 n+1 个叶子节点的二叉树的数量。例如 4个叶子节点的所有二叉树形态:

 

 

卡特兰数 - lz_666888 - lz_666888的博客

(7)圆桌握手问题: 圆桌周围有 2n个人,他们两两握手,但没有交叉的方案数。

 

参考自https://blog.csdn.net/magic_andy/article/details/44998639

你可能感兴趣的:(算法)