zoukankan      html  css  js  c++  java
  • 【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;
    }
    
    
  • 相关阅读:
    汉诺塔
    给出一个字符串,要求插入最少的字符,使得原字符串为一个回文串
    最长回文子串
    回文数 第N个回文数
    屋子里有1到100号100盏关闭的灯
    无头结点的单链表删除一个中间结点
    单链表逆转
    编程之美2.21 加法
    在一个数组中找 差值最大的两个数 差值最小的两个数 推广到 点对
    斐波那契
  • 原文地址:https://www.cnblogs.com/AWCXV/p/11640376.html
Copyright © 2011-2022 走看看