nyoj 164&&poj2084 Game of Connections 【卡特兰】

题意:将1~2n个数按照顺时针排列好,用一条线将两个数字连接起来要求:线之间不能有交点,同一个点只允许被连一次。

最后问给出一个n,有多少种方式满足条件。

分析:

ans[n]表示n的中的种类数。 规定ans[0] = ans[1] = 1;

假设给出的数是n那么从1开始, 与1之间相连的数与1之间间隔的对数分别是0, 1, 。。n-1, 那么我们就可以将他们分割成两部分,对于每一部分我们分别将其的结果求出,之后再相乘就是间隔对数s(s是0, 。。n-1)的总的种类数。

最后我们可以总结出ans[n] = ans[0]*ans[n-1]+ans[1]*ans[n-2]+...ans[n-1]*ans[0];即为卡特兰数。

假设给出的是4,那么一共有8个数,按照顺时针排列,我们假设从1开始,那么1可以与2(之间相差0个数), 4(之间相差2个数), 6(之间相差4个数), 8(之间相差6个数),假如我们知道相差n个数的的种类数,那么我们只需要将他们相加,即为我们所要求的总种类数。下面我就按照上面的例子即n=4分析一下。相差为0的时候,我们只需要考虑剩下的三对即可,则相差为0的种类数就为ans[3]*ans[0],之间相差2的时候我们就吧原有的序列分成了两部分,第一部分只有2个数,第二部分有4个数,那么相差为2的种类数就是ans[2]*ans[1];相差为4的其实就是上面情况的第一部分和第二部分颠倒了,这种情况下的种类数是ans[1]*ans[2],相差为6就是第一种情况的颠倒,所以种类数是ans[3]*ans[0];

代码:

#include <cstdio>
#include <cstring>
int ans[102][100];

void table(){
	ans[0][0] = ans[1][0] = 1;
	int i, j;
	for(i = 2; i < 102; i ++){
		int c = 0;
		for(j = 0; j < 100; j ++){
			ans[i][j] = ans[i-1][j]*(4*i-2)+c;
			c = ans[i][j]/10;
			ans[i][j] %= 10;
		}
		int z = 0;
		for(j = 99; j >= 0; j --){
			z= z*10+ans[i][j];
			ans[i][j] = z/(i+1);
			z %= (i+1);
		}
	}
}
int main(){
	table();
	int temp;
	while(scanf("%d", &temp), temp != -1){
		int i = 99;
		while(ans[temp][i] == 0) i --;
		while(i >= 0) printf("%d", ans[temp][i]), i--;
		printf("\n");
	}
	return 0;
}

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=164

http://poj.org/problem?id=2084

时间: 2024-12-29 12:29:03

nyoj 164&&poj2084 Game of Connections 【卡特兰】的相关文章

POJ2084 Game of Connections 卡特兰数 关于卡特兰数经典的几个问题

Game of Connections Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9128   Accepted: 4471 Description This is a small but ancient game. You are supposed to write down the numbers 1, 2, 3, . . . , 2n - 1, 2n consecutively in clockwise ord

NYOJ 164

卡特兰数的一般项公式: 卡特兰数性质: 1.Cn的另一个表达形式为   所以,Cn是一个自然数,这一点在先前的通项公式中并不显而易见. 2.卡塔兰数满足以下递推关系:  :   它也满足 ,这提供了一个更快的计算卡特兰数的方法. 3.卡塔兰数的渐近增长为    , 它的含义是左式除以右式的商趋向于1 ,当n → ∞.(用斯特林公式易证.) 4.所有的奇卡塔兰数Cn(即Cn%2=1)都满足n = 2k ? 1. 卡特兰数的应用: 1.括号化问题. 矩阵链乘: P=a1×a2×a3×--×an,依据

[POJ2084]Game of Connections

Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7888   Accepted: 3965 Description This is a small but ancient game. You are supposed to write down the numbers 1, 2, 3, . . . , 2n - 1, 2n consecutively in clockwise order on the ground to

B - Game of Connections(卡特兰数)

This is a small but ancient game. You are supposed to write down the numbers 1, 2, 3, ... , 2n - 1, 2n consecutively in clockwise order on the ground to form a circle, and then, to draw some straight line segments to connect them into number pairs. E

POJ 2084 Game of Connections 卡特兰数

看了下大牛们的,原来这题是卡特兰数,顺便练练java.递归式子:h(0)=1,h(1)=1   h(n)= h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2)   打表172MS import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in=new S

NoSQL数据库 -- MongoDB

终于下定决心在某东购买了<python核心编程(二)>和<鸟哥linux,基础 (三)>.感觉学习linux最开始还是在虚拟机里面比较好,所以安装了VirtualBox,并下载了Cent OS 7. 安装完Cent OS发现完全没GUI啊,还好之前用了段时间的Ubuntu,感觉还好. (一) windows系统下面的安装 (1)下载,官网是 http://www.mongodb.org/ 不要去了 com那个.下载的2.4稳定版. (2)下载zip文件,然后解压.在D盘新建mong

HDU 1134 Game of Connections(卡特兰数)

题目代号:HDU 1134 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1134 Game of Connections Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4668    Accepted Submission(s): 2729 Problem Description Thi

POJ 2084 Game of Connections(卡特兰数)

卡特兰数源于组合数学,ACM中比较具体的使用例子有,1括号匹配的种数.2在栈中的自然数出栈的种数.3求多边形内三角形的个数.4,n个数围城圆圈,找不相交线段的个数.5给定n个数,求组成二叉树的种数…… 此题就是第4个样例,是裸卡特兰数,但是这里牵扯的大数,可以使用java的大数类解决,但是我这里使用高精度乘法和除法模拟的(主要是java不会). 此处的递推式为H[1] = 1:H[n] = H[n-1]*(4*n-2)/(n+1){n>=2}:代码如下: 需要注意输出的形式,我这里的进制是100

hdu 1134 Game of Connections 【卡特兰数+大数】

Game of Connections Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3327    Accepted Submission(s): 1896 Problem Description This is a small but ancient game. You are supposed to write down the