noip2003中的第3题栈的计数stack.pas,有没有一个数学公式来解决?

来源:百度知道 编辑:UC知道 时间:2024/06/20 09:21:43

有的
可以设入栈为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