zoukankan      html  css  js  c++  java
  • 进栈序列为(1,2,3..,n)有多少种出栈顺序

    分析方法1

    记f(n)为出栈序列种数。设从第一个数入栈第一次栈为空的出栈数为是k。特别地,如果栈直到整个过程结束时才空,则k=n 。

    首次出空之前第一个出栈的序数k将1~n的序列分成两个序列,其中一个是1~k-1,序列个数为k-1,另外一个是k+1~n,序列个数是n-k。 此时,我们若把k视为确定一个序数,那么根据乘法原理,f(n)的问题就等价于——序列个数为k-1的出栈序列种数乘以序列个数为n - k的出栈序列种数,即选择k这个序数的f(n)=f(k-1)×f(n-k)。而k可以选1到n,所以再根据加法原理,将k取不同值的序列种数相加,得到的总序列种数为:f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0),其中f(0)=1,f(1)=1。

    这与卡特兰数的递推式一致, f(n)=h(n)= C(2n,n)/(n+1)= c(2n,n)-c(2n,n+1)

    分析方法2

    对于每一个数来说,必须进栈一次、出栈一次。把进栈设为状态'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的累计数)的方案数即为所求。得到相同的结论

  • 相关阅读:
    客商支付明细SQL_billdate
    两张表判断赋值,都是NULL惹的祸…
    DataGridView使用初步
    在SQL Server 2005中启用“SQL Server”身份验证
    .Net学习笔记——细节问题
    C#调用带返回值的存储过程
    利用ASP.NET一般处理程序动态生成Web图像
    Windows Forms数据绑定技术
    C#中产生SQL语句的几种方式
    风讯dotNETCMS源码分析—数据存取篇
  • 原文地址:https://www.cnblogs.com/uangjianghui/p/7804178.html
Copyright © 2011-2022 走看看