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

时间:2019-10-09
本文章向大家介绍【2-10】标准 2 维表问题,主要包括【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\n",temp1/temp2);
    }
    return 0;
}

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