出栈序列统计解题报告.doc_第1页
出栈序列统计解题报告.doc_第2页
出栈序列统计解题报告.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

出栈序列统计解题报告题目描述很简单,将数据通过栈输的序列数目输出。由于只有两种操作push 和 pop (即入栈和出栈),所以我们可以把入栈操作记为0,出栈操作记为1。所以这道题可以转化为在2n个数中放入n个1(其余的填充0)且满足任何一个位置中的1个数不大于0的个数的排列方式。有了这样一个模型解题就有了我们的方向。1、直接接受的方法应推搜索:我们可以枚举所有满足要求的排列方式,再不重复的前提下将计数器加1。方法很简单但是效率很低很低。 2、O(n)的算法(组合法): 首先不要过于激动我们的两种算法的效率差距。经过下面分析你会发现其实我们所要求的只不过是卡特兰数。首先在2n个位置中放n个1的方法有C(n/2n)种,当然其中也有不满足情况的序列。那么不满足情况的序列有什么性质呢?再不满足要求的序列中肯定有一个地方满足 “1的个数”= “0的个数”+1,此时这个位置以后的1个数为0的个数-1(因为他们个数均各为n)。我们不妨把此位置以左的0和1对调(即原为1出改为0,原为0处改为1),则肯定有n+1个0和n-1个1,所以C(n-1/2n)种可能他不满足我们的要求。因此所求的数为C(n/2n)-C(n-1/2n),经过数学化简我们可以发现该式是等价于C(n/2n)/(n+1),即为卡特兰数。 以该模型为基础的实际问题有非常多,例如球票问题 另外由于数字较大,所以需要高精度算法。附程序据参考: program stack; var c:array1.10000 of longint; n,i,j,k,t,z:longint; begin assign(input,stack.in);reset(input); assign(output,stack.out);rewrite(output); readln(n); fillchar(c,sizeof(c),0); c1:=1;z:=1; for i:=2*n downto n+2 do begin for j:=1 to z do cj:=cj*i; for j:=1 to z+4 do begin cj+1:=cj+1+cj div 10; cj:=cj mod 10; end; z:=z+5; while cz=0 do dec(z); end; for i:=n downto 2 do begin t:=0; for j:=z downto 1 do begin k:=cj; cj:=(k+t*10) div i; t:=(k+t*10) mod i; end; while cz=0 do dec(z); end; for i:=z downto

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论