vijos - P1122出栈序列统计 (卡特兰数)

P1122出栈序列统计

未递交

标签:NOIP普及组2003[显示标签]

描写叙述

栈是经常使用的一种数据结构,有n令元素在栈顶端一側等待进栈,栈顶端还有一側是出栈序列。

你已经知道栈的操作有两·种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出。如今要使用这两种操作。由一个操作序列能够得到一系列的输出序列。

请你编程求出对于给定的n,计算并输出由操作数序列1,2,…。n。经过一系列操作可能得到的输出序列总数。

格式

输入格式

一个整数n(1<=n<=15)

输出格式

一个整数,就可以能输出序列的总数目。

例子1

例子输入1[复制]

3

例子输出1[复制]

5

限制

每一个測试点1s

来源

#include <map>
#include <set>
#include <ctime>
#include <queue>
#include <vector>
#include <cstdio>
#include <cctype>
#include <string>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>

using namespace std;

#define pb push_back
#define mp make_pair
#define fillchar(a, x) memset(a, x, sizeof(a))
#define copy(a, b) memcpy(a, b, sizeof(a))
#define S_queue<P> priority_queue<P, vector<P>,greater<P> >

typedef long long LL;
typedef pair<int, int > PII;
typedef unsigned long long uLL;
template<typename T>
void print(T* p, T* q, string Gap = " "){int d = p < q ? 1 : -1;while(p != q){cout << *p;p += d;if(p != q) cout << Gap; }cout << endl;}
template<typename T>
void print(const T &a, string bes = "") {int len = bes.length();if(len >= 2)cout << bes[0] << a << bes[1] << endl;else cout << a << endl;}

const int INF = 0x3f3f3f3f;
const int MAXM = 1e5;
const int MAXN = 1e4 + 5;
int A[MAXN];

int main(){
    int n;
    scanf("%d", &n);
    int ans = 1;
    for(int i = 1;i <= n;i ++){
        ans = 2 * (2 * (i - 1) + 1) * ans / (i + 1);
    }
    print(ans);
    return 0;
}
时间: 2024-10-06 05:23:35

vijos - P1122出栈序列统计 (卡特兰数)的相关文章

Catalan数 &amp;&amp; 【NOIP2003】出栈序列统计

令h(1)=1, h(0)=1,catalan数满足递归式: h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)h(0) (n>=2) =C(2n, n)/(n+1) =h(n-1)*2(2n-1)/(n+1) 具体推导请百度,这里只需记得推导公式为h(n)=h(n-1)*2(2n-1)/(n+1)即可. 我们来说说这个的应用吧,从catalan数的定义递归定义可以看出,它是由自己 本身的一部分和n减去一部分 的和得到的,也就是说,有n个物品,1个物品进行操作1,n-

不要搜索,出栈序列统计

1627: 出栈序列统计 时间限制: 1 Sec  内存限制: 128 MB 题目描述 栈是常用的一种数据结构,有n令元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列.你已经知道栈的操作有两·种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出.现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列.请你编程求出对于给定的n,计算并输出由操作数序列1,2,-,n,经过一系列操作可能得到的输出序列总数. 输入 一个整数n(1<=n<=15) 输出 一个整数,即可能输出序列的总数

出栈顺序 与 卡特兰数(Catalan)的关系

一,问题描述 给定一个以字符串形式表示的入栈序列,请求出一共有多少种可能的出栈顺序?如何输出所有可能的出栈序列? 比如入栈序列为:1 2 3  ,则出栈序列一共有五种,分别如下:1 2 3.1 3 2.2 1 3.2 3 1.3 2 1 二,问题分析 先介绍几个规律: ①对于出栈序列中的每一个数字,在它后面的.比它小的所有数字,一定是按递减顺序排列的. 比如入栈顺序为:1 2 3 4. 出栈顺序:4 3 2 1是合法的,对于数字 4 而言,比它小的后面的数字是:3 2 1,且这个顺序是递减顺序.

【回溯法】出栈序列统计

必三更起五更眠:最无益,莫过一日曝十日寒. [回溯法]出栈序列统计 时间限制: 1 Sec  内存限制: 128 MB提交: 17  解决: 11[提交][状态][讨论版] 题目描述 栈是常用的一种数据结构,有n令元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列.你已经知道栈的操作有两·种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出.现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列.请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得

出栈顺序(卡特兰数)

题目描述: 按照1,2,...,n-1,n的顺序入栈,问可以得到多少种出栈序列.如n=3时有1 2 3,1 3 2,2 1 3,2 3 1,3 2 1共5种出栈序列. 解题思路: 设f(n)为n个数时的方案数. 可知 f(0)=1: f(1)=1: f(2)=2:  f(3)=5: 当n=4时 : F1    F2    F3    F4 1 2 3 4  //四种状态分别标记为F1,F2,F3,F4 若F1 位于一号位置 则之前的数字出栈顺序的情况数为F(0),在一号位置后的数字出栈顺序的情况

出栈序列统计

[问题背景] 今天是一个阳光明媚,风和日丽的好日子,猪爸爸和猪妈妈带着佩奇和乔治去海滩玩耍.佩奇突发奇想,给乔治出了这么一道题. [问题描述] 栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列.你已经知道栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出.现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列.请你编程求出对于给定的n,计算并输出由操作数序列1,2,-,n,经过一系列操作可能得到的输出序列总数. 乔治才两岁,没法解决这

栈与队列问题1——出栈序列

问题描述:栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列.你已经知道栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出.现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列.请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数. 分析:之前就有看过这种问题.就是火车进站问题,判断序列是否合法,当时是用STL栈做的.这个题只需统计次数,那么,方法就十分简便了,递归和动归都可以实现,当然

生成所有的出栈序列 (回溯法)

给定一个入栈序列,找出所有可能的出栈序列. 如入栈序列为 [1, 2, 3] 则可能的出栈序列为 : [ 3 2 1 ] [ 2 3 1 ] [ 2 1 3 ] [ 1 3 2 ] [ 1 2 3 ] 采用回溯法和递归统计所有可能的出栈序列. 当所有的入栈序列已经全部入栈后,则只能出栈 当栈为空时,只能进栈 当仍有入栈元素且栈不为空时,可以入栈,也可以出栈 入栈 -> 递归处理下一个入栈元素 -> 恢复未入栈状态 出栈 -> 将出栈元素添加到出栈序列 -> 递归处理下一个入栈元素

POJ1363 Rails 验证出栈序列问题(转)

题目地址: http://poj.org/problem?id=1363 此题只需验证是否为合法的出栈序列. 有两个思路:1.每个已出栈之后的数且小于此数的数都必须按降序排列.复杂度O(n^2),适合人脑. //思路 1 不对!!! 例如 数据 ,               3 5 2 4 1              --------                正确答案为 no 2.另一个思路就是直接模拟入栈出栈过程.虽然模拟毫无技巧可言,但复杂度O(n),优于算法1.适合电脑. 代码如