对于每一个数来说,必须进栈一次、出栈一次。我们把进栈设为状态‘1’,出栈设为状态‘0’。n个数的所有状态对应n个1和n个0组成的2n位二进制数。由于等待入栈的操作数按照1‥n的顺序排列、入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数。
在2n位二进制数中填入n个1的方案数为C(2n,n),不填1的其余n位自动填0。从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所求。不符合要求的数的特征是由左而右扫描时,必然在某一奇数位2m+1位上首先出现m+1个0的累计数和m个1的累计数,此后的2(n-m)-1位上有n-m个 1和n-m-1个0。如若把后面这2(n-m)-1位上的0和1互换,使之成为n-m个0和n-m-1个1,结果得1个由n+1个0和n-1个1组成的2n位数,即一个不合要求的数对应于一个由n+1个0和n-1个1组成的排列。
反过来,任何一个由n+1个0和n-1个1组成的2n位二进制数,由于0的个数多2个,2n为偶数,故必在某一个奇数位上出现0的累计数超过1的累计数。同样在后面部分0和1互换,使之成为由n个0和n个1组成的2n位数,即n+1个0和n-1个1组成的2n位数必对应一个不符合要求的数。
因而不合要求的2n位数与n+1个0,n-1个1组成的排列一一对应。
显然,不符合要求的方案数为C(2n,n+1)。由此得出输出序列的总数目=C(2n,n)-C(2n,n+1)=C(2n,n)/(n+1)=h(n+1)。
//模拟过程如下,dfs来填充入栈和出栈的标志#include<iostream>
#include<cstring>
#include<cstdio>
#include<stack>
#define N 100
using namespace std;int a[N];
int p[2*N];
int pre[2*N];
int used[2*N];
int index[2*N];//如果a[i]==1,那么表示第index[i]个数入栈
int n;
int cnt;//记录多少个出栈的序列 int C(int n){int ans=1;int m = 2*n;int nn = n;for(int i=1; i<=n; ++i){ans *= m--;ans /= i;}return ans/(nn+1);
}void solve(){memset(pre, 0, sizeof(pre));memset(used, 0, sizeof(used));int prek = 0;for(int i=1; i<=2*n; ++i){if(a[i] == 1){pre[i] = prek;prek = i;} else {int ii = prek;while(used[ii]) ii = pre[ii];cout<<p[index[ii]]<<" ";//出栈 used[ii] = 1;pre[prek] = pre[ii];}}cout<<endl;
}void solve1(){stack<int>s;int k=1;for(int i=1; i<=2*n; ++i){if(a[i] == 1)s.push(p[k++]);else {cout<<s.top()<<" ";s.pop();}}cout<<endl;
}void dfs(int k, int cnt0, int cnt1){if(k>2*n){//solve();
        solve1(); ++cnt; return ;}if(cnt1<n){//入栈 a[k] = 1;index[k] = cnt1+1;//第几个数入栈 dfs(k+1, cnt0, cnt1+1);}if(cnt0<cnt1){//出栈 a[k] = 0;dfs(k+1, cnt0+1, cnt1);}
}int main(){cin>>n;for(int i=1; i<=n; ++i) cin>>p[i];dfs(1, 0, 0);cout<<endl<<"模拟个数:"<<cnt<<endl;cout<<"公式个数:"<<C(n)<<endl;return 0;
}

类似问题 买票找零
有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
最终结果:C(2n,n)-C(2n,n+1)

转载于:https://www.cnblogs.com/hujunzheng/p/4845354.html

N个数依次入栈,出栈顺序有多少种?相关推荐

  1. 2023新华为OD机试题 - 入栈出栈(JavaScript) | 刷完必过

    华为Od必看博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单 华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典 华为OD机试 全流程解析+经验分享,题型分 ...

  2. PLC实现入栈出栈功能(SCL)

    PLC实现入栈出栈功能(SCL 引言 功能需求 准备工作 入栈 PLC程序 出栈 PLC程序 触摸屏画面程序 源程序 引言 之前用梯形图实现了PLC入栈出栈功能,这次使用SCL来实现此功能. 功能需求 ...

  3. Go语言_数据结构_栈(包括入栈和出栈,表达式的入栈出栈详细过程代码实现)

    入栈和出栈代码实现如下: package main import ("fmt""errors" )//使用数组来模拟一个栈的使用 type Stack stru ...

  4. 【数据结构】栈详解——压栈/入栈 | 弹栈/出栈 | 获取栈顶元素

    栈 顺序栈 栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈, ...

  5. PLC实现入栈出栈功能

    入栈出栈 实现需求 准备工作 入栈 PLC程序 仿真效果 出栈 PLC程序 仿真效果 源程序 实现需求 使用西门子PLC实现入栈出栈的功能,出入栈顺序为先入先出 准备工作 创建FC块.入栈和出栈两个F ...

  6. 【Android 逆向】x86 汇编 ( push / pop 入栈 / 出栈 指令 | ret / retn 函数调用返回指令 | set 设置目标值指令 )

    文章目录 一.push / pop 入栈 / 出栈 指令 二.ret / retn 函数调用返回指令 三.set 设置目标值指令 总结 一.push / pop 入栈 / 出栈 指令 push / p ...

  7. 数据结构 - 栈(链表实现栈的入栈出栈)

    学完链表和栈,数组模拟栈学完后,自己根据链表写了个链栈,虽然只是简单的实现了入栈出栈遍历.收获还是很大的. 在push这里思考了一会,思路是:传入一个数字,push里创建一个节点node,把数据加入n ...

  8. Java开发中巧妙使用链表来实现模拟栈的入栈出栈操作

    2019独角兽企业重金招聘Python工程师标准>>> 在Java开发中经常会碰到需要你用Java链表来实现入栈出栈的模拟操作,下文就这个操作做了一个详细的描述. 栈:后进先出:最后 ...

  9. 【OpenGL】二十一、OpenGL 矩阵压栈与出栈 ( 不同类型矩阵变换先后顺序 | 渲染前不设置单位阵 | 压栈出栈原理分析 | 代码示例 )

    文章目录 一.不同类型矩阵变换先后顺序 二.渲染前不设置单位阵 三.矩阵的压栈和出栈原理分析 四.矩阵的压栈和出栈代码示例 五.相关资源 一.不同类型矩阵变换先后顺序 对 OpenGL 中的 模型视图 ...

  10. 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】

    刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高. 华为 OD 清单查看地址:https://blog.csdn.net/hihell/categor ...

最新文章

  1. js 连接mysql_关于Node.js 链接mysql超时处理(默认8小时)
  2. 论文精读——CenterNet :Objects as Points
  3. 2017-07-02 前端日报
  4. python调用键盘_使用 Python 控制自己的电脑和键盘是一种什么样的体验?
  5. 码云提交时报错git 报错 fatal: unable to auto-detect email address (got 'Administrator@PC-20180504MMDH.(none)'
  6. 墙面有几种装修方法_卧室装修静音环保攻略,赶紧收藏起
  7. 图像处理小tip——中值滤波的多种实现(包括快速中值滤波算法)
  8. matlab 均匀设计编程,均匀设计均匀设计表--方开泰.doc
  9. 怎样进入金蝶服务器修改参数,金蝶KIS专业版的系统参数在哪里设置
  10. html5京东页面布局,京东移动端页面布局(一)
  11. DRM in Android
  12. 2021-07-16思考-资本源于贪婪(与人性抗争)
  13. php yar call,php yar扩展在laravel中的使用
  14. scdl matlab,5自由度移动机器人的建模与仿真-硕士论文
  15. POE方案之SI3402-B
  16. 解决:电脑屏幕每隔几分钟就闪一次(瞬间黑屏一次),鼠标指针伴随着加载的状态(漏斗或者转圈),然后瞬间恢复正常
  17. Java创建泛型数组的一种方法
  18. B端产品设计:价值主张与需求对应的价值
  19. 乱贴小广告违法 有人仍一意孤行
  20. u-boot.lds文件诠释

热门文章

  1. java客户端程序用什么自动化测试_五大Java自动化测试框架
  2. uni-app单个页面的生命周期函数
  3. 定时任务的并发_03
  4. html、css、js、react、vue 文字一行一行显示出来
  5. JavaScript-数据类型
  6. 运行Java程序时 Tomcat出错 显示端口被占用
  7. appium java 点击事件_“按钮点击”在Appium Android测试中给出“处理命令时出现未知的服务器端错误 . ”...
  8. 记录——oracle数据库备份
  9. 在列表前方插入一个数据_通俗易懂的Redis数据结构基础教程
  10. 怎样清除手机中的html文件夹,怎么彻底清除手机APP卸载后的残留文件夹 能删与不能删文件名...