公安局长二电视剧:noip2003中的第3题栈的计数stack.pas,有没有一个数学公式来解决?

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/06 20:08:28

有的
可以设入栈为1,出栈为0,不入栈为10,对于任意一种方案,与2N委的01序列一一对应,且对前任意位,1的个数总〉=0的个数。可以证明,在2N位的01任意排列中,不符合要求的个数为C2n n+1 ,则可产生的序列数(C2n n)-(C2n n+1)=(C2n n)/(n+1),即为n的Catalan数

具体算法如下
1。
Const Maxn=18;
Var n,i,j,k:Integer;
a,b,c,d:Array[1..Maxn] of integer;
s:real;
fi,fo:string;
Begin
write(''Input file name: ''); readln(fi);
write(''Output file Name: ''); readln(fo);
assign(Input,fi); assign(output,fo);
reset(Input); rewrite(Output);
Readln(n);
For i:=1 to n do
Begin
a[i]:=2*n-i+1;
b[i]:=i;
End;
For k:=2 to n do
For i:=1 to n do
For j:=1 to n do
If (a[i] mod k=0) and (b[j] mod k=0) Then Begin a[i]:=a[i] div k; b[j]:=b[j] div k End;

s:=1;
For i:=1 to n do
s:=s*a[i];
s:=s/(n+1);
Writeln(s:0:0);
close(input); close(output);
End.
2.递归program stack;
var
f1,f2:text;
i,j,n,m:integer;
result:longint;
function sta(n:integer):longint;
var i:integer;
begin
if n in[0,1] then sta:=1 else begin
sta:=0;for i:=0 to n-1 do sta:=sta+sta(i)*sta(n-i-1);end;
end;
begin
assign(f1,'Stack.in');assign(f2,'Stack.out');reset(f1);rewrite(f2);
read(f1,m);
result:=sta(m);
write(f2,result);
close(f1);
close(f2);
end.

有的
可以设入栈为1,出栈为0,不入栈为10,对于任意一种方案,与2N委的01序列一一对应,且对前任意位,1的个数总〉=0的个数。可以证明,在2N位的01任意排列中,不符合要求的个数为C2n n+1 ,则可产生的序列数(C2n n)-(C2n n+1)=(C2n n)/(n+1),即为n的Catalan数