转载请标注转载自:http://blog.csdn.net/llwwlql/article/details/53129224
标准二维表问题
问题描述:
设n是一个正整数。2*n的标准二维表是由正整数1,2,…,2n组成的2*n数组,该数组的每行从左到右递增,每列从上到下递增。2*n的标准二维表全体记为tab(n)。例如,当n=3时,tab(3)二维表如下图所示。
|
|
|
|
|
编程任务:
给定正整数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;
}