标准二维表问题 (卡特兰数)

18 篇文章 0 订阅
7 篇文章 0 订阅

转载请标注转载自:http://blog.csdn.net/llwwlql/article/details/53129224

标准二维表问题

问题描述:

设n是一个正整数。2*n的标准二维表是由正整数1,2,…,2n组成的2*n数组,该数组的每行从左到右递增,每列从上到下递增。2*n的标准二维表全体记为tab(n)。例如,当n=3时,tab(3)二维表如下图所示。

1

2

3

4

5

6

 

1

2

4

3

5

6

 

1

2

5

3

4

6

 

1

3

4

2

5

6

 

1

3

5

2

4

6

 

 

编程任务:

给定正整数n,试计算tab(n)中2*n二维表的个数。


分析:

1、先把2*n个数字排成一行来看(1~2*n 有序)。放到第一行的数字标记为0,放到第二行的数字标记为1,这样就可以有一个01的序列,题目要求前面的数字比后面和下面的数字小,这样可以转换为,序列前面每个数字前面0的个数要大于等于1的个数。

2、把该问题转换成进栈出栈的问题。n个数字,进栈是0,出栈是1,这样可以保证输出的进栈出栈序列前面0的个数大于等于1的个数,符合题目要求前面的数字比后面和下面的数字小,即一定能保证每个数字序列前面0的个数要大于等于1的个数。

又因为栈的出栈进栈次序所组成的排列是卡特兰数,所以这个题可以转换成求卡特兰数来做。

我这里只是简单的算了一下卡特兰数,没有计算大数的情况,根据递推公式打表就可算出。大数的卡特兰数我博客的其他文章:大卡特兰数

代码如下:

#include <stdio.h>
unsigned long long c[25];
void init()
{
	int i,j;
	c[1]=1;
	for(i=2;i<=20;i++)
		c[i]=c[i-1]*(4*i-2)/(i+1);	
}
int main()
{
	int n;
	init();
	while(~scanf("%d",&n))
	{
		printf("%I64d\n",c[n]);
	}
	
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值