【2-10】标准 2 维表问题

问题描述:
设 n 是一个正整数。2´n 的标准 2 维表是由正整数 1,2,…,2n 组成的 2´n 数组,该
数组的每行从左到右递增,每列从上到下递增。2´n 的标准 2 维表全体记为 Tab(n)。例如,
当 n=3 时 Tab(3)如下:
1 2 3 1 2 4 1 2 5 1 3 4 1 3 5
4 5 6 3 5 6 3 4 6 2 5 6 2 4 6
´编程任务:
给定正整数 n,计算 Tab(n)中 2´n 的标准 2 维表的个数。
´数据输入:
由文件 input.txt 给出输入数据。第一行有 1 个正整数 n。
´结果输出:
将计算出的 Tab(n)中 2´n 的标准 2 维表的个数输出到文件 output.txt。
输入文件示例 输出文件示例
input.txt output.txt
3 5

【题解】

把数字1..2*n填到这个二维表中。 按顺序从1开始填(然后从左到右填,这样的话从左到右就是不下降的了) 假设当前要填的数字是i 如果把一个数字入栈,则把i填到第一行最左边的空缺处。 如果把一个数字出栈,则把i填到第二行最左边的空缺处。 这样的话,出栈的时候,就把数字填到第二行最左边的空缺处。 然后看看这个数字所在的列,对应的第一行有没有数字(如果有肯定比它小) 如果没有的话,就说明这不是一个合法的入栈出栈序列。 答案就呼之欲出了。 ->出栈序列的个数 ->卡特兰数 通项公式是C(2n,n)/(n+1)

【代码】

#include <cstdio>
using namespace std;

const int N = 15;

int n;
long long f[N+10];

int main(){
    f[0] = 1;
    for (int i = 1;i <= N;i++) f[i] = f[i-1]*i;
    while(~scanf("%d",&n)){
        long long temp1 = f[2*n];
        long long temp2 = f[n+1]*f[n];
        printf("%I64d
",temp1/temp2);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/AWCXV/p/11640376.html