Catalan数就是魔法

火车进出栈问题即:

一个栈(无穷大)的进栈序列为 1,2,3,4,...,n 求有多少个不同的出栈序列?

将问题进行抽象, 假设'+'代表进栈, 则有'-'代表出栈

那么如果进栈序列为123, 则:

+ + + - - - 将1, 2, 3压入栈后再将3, 2, 1弹出 得到出栈序列为321

同样, + - + - + - 得到出栈序列为123

上面所述的均为合法进出栈的序列 可发现规律: 序列中 + 的个数等于 - 的个数

但是如 + - - + +  - 这样的序列, 在栈为空时仍进行弹出操作的, 为非法序列

进一步将 + - 序列抽象到平面直角坐标系中, + 代表向右走一格, -代表向上走一格, 可知y = x直线下方的序列均为合法序列, 如下图所示:

到这里, 火车进出栈问题就已经抽象为非降路径(只能向上走或向右走的路径)的问题

对于路径计数问题:

1)从(0,0)到(n,n)的非降路径等于n个x和n个y的排列数 即路径数为C(2n, n);

2)如果不是合法序列, 则会经过上图中的红线, 不合法序列一定会经过点(n -1, n), 从(0, 0)到(n -1, n)有C(2n, 2n-1)种不合法的路径;

3)综合1), 2) 并依据组合数性质化简

推导出公式:

我们可以得到出栈序列的总数为C(2n, n) / (n + 1).

下面以luogu P1044 栈为例, 完整代码如下:

/*
* @Author: Hellcat
* @Date: 2020-02-27 15:54:37
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; ll C(int n, int m) {
ll ans = ;
for(ll i = ; i <= m; i++)
ans = ans * (n - m + i) / i;
return ans;
} int main() {
int n;
scanf("%d", &n);
printf("%lld\n", C(*n, n) / (n + ));
}

题给数据量不大 选择高效的组合数计算方法即可 无需高精度算法.

同时给出完全模拟的dfs暴力搜索算法如下:

dfs时候需要注意 为保证字典序输出优先考虑出栈.

#include <bits/stdc++.h>
using namespace std; int n, cnt = ;
vector<int> state1;
stack<int> state2;
int state3 = ; int res = ; void dfs() {
if(!cnt) return;
if(state1.size() == n) {
res++;
cnt--;
for(auto x : state1) cout<<x;
puts("");
return;
}
// 按字典序输出 则出栈先
if(state2.size()) { // 出栈
state1.push_back(state2.top());
state2.pop();
dfs();
state2.push(state1.back()); // 回溯
state1.pop_back();
}
if(state3 <= n) { // 入栈
state2.push(state3);
state3++;
dfs();
state3--; // 回溯
state2.pop();
}
} int main() {
scanf("%d", &n);
dfs();
printf("%d\n", res);
}

输入

3

输出

123
132
213
231
321
5

luogu P1044 火车进出栈问题(Catalan数)的更多相关文章

  1. 【讲●解】火车进出栈类问题 & 卡特兰数应用

    火车进出栈类问题详讲 & 卡特兰数应用 引题:火车进出栈问题 [题目大意] 给定 \(1\)~\(N\) 这\(N\)个整数和一个大小无限的栈,每个数都要进栈并出栈一次.如果进栈的顺序为 \( ...

  2. tyvj/joyoi 1374 火车进出栈问题(水水版)

    我受不了了. Catalan数第100项,30000项,50000项,cnm 这tm哪里是在考数学,分明是在考高精度,FFT...... 有剧毒! 我只得写高精度,只能过100的那个题,两个进化版超时 ...

  3. CH1102 火车进出栈问题(高精/卡特兰数)

    描述 一列火车n节车厢,依次编号为1,2,3,-,n.每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种. 输入格式 一个数,n(n<=60000) 输出格式 一个数s表示 ...

  4. 洛谷P1044 栈(Catalan数)

    P1044 栈 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重要 ...

  5. 火车进出栈 java

    题目描述 一列火车n节车厢,依次编号为1,2,3,…,n.每节车厢有两种运动方式,进栈与出栈,问n节车厢出栈的可能排列方式有多少种. 输入 一个数,n(n<=60000) 输出 一个数s表示n节 ...

  6. Catalan数与出栈顺序个数,Java编程模拟

    问题描述: 队列中有从1到7(由小到大排列)的7个整数,问经过一个整数栈后,出栈的所有排列数有多少?如果整数栈的容量是4(栈最多能容纳4个整数),那么出栈的排列数又是多少? 分析:对于每一个数字i, ...

  7. Catalan数 && 【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) ...

  8. Catalan数,括号序列和栈

    全是入门的一些东西.基本全是从别处抄的. 栈: 支持单端插入删除的线性容器. 也就是说,仅允许在其一端加入一个新元素或删除一个元素. 允许操作的一端也叫栈顶,不允许操作的一端也叫栈底. 数个箱子相叠就 ...

  9. [Catalan数]1086 栈、3112 二叉树计数、3134 Circle

    1086 栈 2003年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 栈是计算机中 ...

随机推荐

  1. CSS学习(8)盒模型

    box:盒子,每个元素在页面中都会生成一个矩形区域(盒子) 盒子类型: 1.行盒,display属性=inline的元素,不换行(默认值) 2.块盒,display属性=block的元素,换行 浏览器 ...

  2. 每天进步一点点------入门视频采集与处理(显示YUV数据)

    做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始 ...

  3. Python的几种主动结束程序方式

    1. sys.exit() 执行该语句会直接退出程序,这也是经常使用的方法,也不需要考虑平台等因素的影响,一般是退出Python程序的首选方法. 该方法中包含一个参数status,默认为0,表示正常退 ...

  4. 《爬虫学习》(三)(requests库使用)

    requests库 虽然Python的标准库中 urllib模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests宣传是 “HTTP for Human ...

  5. 你知道for(;;) vs. while(true)那个更快吗?

    来来来, for(;;) vs. while(true) 有什么区别?从java的语义上来说,他们是一模一样的.为何怎么说? 开始我们先测试for(;;) package com.tony.test; ...

  6. C:数组基础

    数组 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来--称为数组. 数组就是在内存中连续的相同类型的变量空间.同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的 ...

  7. Java 判断五子棋五子相连

    #开始 最近在忙着做一个基于酷Q的QQ机器人,想到了做游戏,第一个想到的霸气点的游戏就是五子棋啊  ` _>` 因为没有图形界面的原因 所有核心就是判断是否在棋盘上出现了五个棋子连在一起的情况 ...

  8. Git主库私库相关操作操作

    命令1: git remote add 库名称 库地址 说明:写好的代码提交到两个git远端,git remote add是将另一个库地址设置进来 命令2: git fetch 库名称 分支名称 说明 ...

  9. Mysql架构、复制类型、复制功能介绍

    1.1 常见的几种主从架构 一主一从 一主多从 多主一从 双主互备 1.2 主从复制功能 1)实时灾备 2)读写分离 3)高可用 4)从库数据统计 5)从库数据备份 6)平滑升级 1.3 三种复制方式 ...

  10. nfs的原理 安装配置方法 centos6.5

    NFS周边 Network File System 作用 像访问本地文件一样去访问NFS服务器上的文件,目录 引用场景: ..1 用户上传的静态文件---图片,视频,用户上传的视频,头像 ..2 中小 ...