您的位置:首页 > 其它

NYOJ---164 &&HDOJ1134&&POJ2084 --> Game of Connections

2014-07-31 09:56 393 查看
GameofConnections(卡特兰数)

时间限制:1000ms|内存限制:65535KB

难度:3

链接:链接--NYOJ164,链接--HDU1134,链接--POJ2084

描述

Thisisasmallbutancientgame.Youaresupposedtowritedownthenumbers1,2,3,...,2n-1,2nconsecutivelyinclockwiseorderonthegroundtoformacircle,andthen,todrawsomestraightlinesegmentstoconnectthemintonumberpairs.Everynumbermustbeconnectedtoexactlyoneanother.

And,notwosegmentsareallowedtointersect.

It'sstillasimplegame,isn'tit?Butafteryou'vewrittendownthe2nnumbers,canyoutellmeinhowmanydifferentwayscanyouconnectthenumbersintopairs?Lifeisharder,right?


输入

Eachlineoftheinputfilewillbeasinglepositivenumbern,exceptthelastline,whichisanumber-1.

Youmayassumethat1<=n<=100.

输出

Foreachn,printinasinglelinethenumberofwaystoconnectthe2nnumbersintopairs

样例输入


2

3

-1


样例输出


2

5
既然涉及到卡特兰数,这里稍微给出一些介绍:
1:起源:
卡特兰数又称卡塔兰数,英文名Catalannumber,是组合数学中一个常出现在各种计数问题中出现的数列。
由以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名,其前几项为:
1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,
2674440,9694845,35357670,129644790,477638700,1767263190,6564120420,24466267020,
91482563640,343059613650,1289904147324,4861946401452,...

2原理

令h(0)=1,h(1)=1,catalan数满足递推式

h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)h(0)(n>=2)例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5另类递推式[2]:h(n)=h(n-1)*(4*n-2)/(n+1);递推关系的解为:h(n)=C(2n,n)/(n+1)(n=0,1,2,...)递推关系的另类解为:h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,...)
以下转载:/article/1510886.html
总结了一下,最典型的四类应用:1.括号化问题。矩阵链乘:P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)2.出栈次序问题。一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?类似:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)3.将多边行划分为三角形问题。将一个凸N+2多边形区域分成三角形区域的方法数?类似:一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?类似:在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?4.给顶节点组成二叉树的问题。给定N个节点,能构成多少种不同的二叉树?(能构成h(N)个)Catalan数的解法Catalan数的组合公式为Cn=C(2n,n)/(n+1);此数的递归公式为h(n)=h(n-1)*(4*n-2)/(n+1)卡特兰数真是一个神奇的数字,很多组合问题的数量都和它有关系,例如:Cn=n对括号正确匹配组成的字符串数,例如3对括号能够组成:((()))()(())()()()(())()(()())Cn=n+1个数相乘,所有的括号方案数。例如,4个数相乘的括号方案为:((ab)c)d(a(bc))d(ab)(cd)a((bc)d)a(b(cd))Cn=拥有n+1个叶子节点的二叉树的数量。例如4个叶子节点的所有二叉树形态:

Cn=n*n的方格地图中,从一个角到另外一个角,不跨越对角线的路径数,例如,4×4方格地图中的路径有:


Cn=n+2条边的多边形,能被分割成三角形的方案数,例如6边型的分割方案有:


Cn=圆桌周围有2n个人,他们两两握手,但没有交叉的方案数。
下面是一些大公司的笔试题先来一道阿里巴巴的笔试题目:说16个人按顺序去买烧饼,其中8个人每人身上只有一张5块钱,另外8个人每人身上只有一张10块钱。烧饼5块一个,开始时烧饼店老板身上没有钱。16个顾客互相不通气,每人只买一个。问这16个人共有多少种排列方法能避免找不开钱的情况出现。C8=1430,所以总数=1430*8!*8!2012腾讯实习招聘笔试题在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,图书馆此时没有了面试宝典了,求他们排队的总数?C3=5;所以总数为5*3!*3!=180.
题意:n个数按照顺时针排列,求每两个数之间用一条直线连接,要求不能相交的总的可能数。

思路:算法分析:Catalan数、大数加法、大数乘法,在大数运算中这里用了Java的大数运算。
[code]/**************
Author:jiabeimuwei
Times:36ms;
Sources:NYOJ164
**************/
importjava.math.BigInteger;
importjava.util.*;
publicclassMain
{
publicstaticvoidmain(String[]args)
{
Scannercin=newScanner(System.in);
BigIntegerBIGnum[]=newBigInteger[101];
BIGnum[1]=BigInteger.ONE;
for(inti=2;i<101;i++)
{
BIGnum[i]=BIGnum[i-1].multiply(BigInteger.valueOf(4*i-2))
.divide(BigInteger.valueOf(i+1));
}
intn;
while(true)
{
n=cin.nextInt();
if(n==-1)break;
System.out.println(BIGnum
);
}
}

}
学长的比较优的代码:

importjava.io.*;
importjava.lang.*;
importjava.math.BigInteger;
importjava.util.Scanner;
classMain{
staticBigInteger[]h=newBigInteger[110];
publicstaticvoidmain(String[]args)
{
h[0]=BigInteger.ONE;
intn=101;
for(inti=1;i!=n;i++)
h[i]=(h[i-1]).multiply(BigInteger.valueOf((4*i-2))).divide(BigInteger.valueOf(i+1));
Scannercin=newScanner(System.in);
while(cin.hasNextInt())
{
intm=cin.nextInt();
if(m==-1)break;
System.out.println(h[m].toString());
}
}
}


吐槽:
本来这篇昨天下午就应该总结的,下午一出工作室,实在忍不住肚子的咕咕叫,直接就奔餐厅了,原谅吃货一枚,
早上有一觉醒来,又是九点多了……^_^.
继续学习!!!
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: