刚想到两点栈规,先假设有n个数要入栈,这n个数依序分别为1到n。

第一点:如果整数x入栈(即x为栈顶元素),则小于x的整数必已入栈。

第二点:如果整数y出栈(即y为栈顶元素),则大于y的整数必已出栈。

有上述两点规则可知:已知x已出栈,如果y出栈,且y<x,则对于整数z(z>y && z <= x),z必已出栈。

进而可以推出另一个结论:如果y = 1刚出栈, y是第k个出栈,则2—k已出栈,且k+1—n都还未入栈。

看懂了上面的推理,应该可以很快推出hdu1023的公式:f[n] = sum(f[i] * f[n - i - 1]),其中0<= i <= n - 1;

公式推理如下:

对于n列火车,编号分别为从1到n

如果出栈后1排在第1个位置,则1先入栈,然后立即出栈,其余的仍然有序,个数为n-1,所以出栈次序数num = f[n-1];

如果出站后1排在第2个位置,由上面的结论知,在1前的一定是2,那么就是1入栈后不动,2入出,1出,剩余n-2个数随意,则num = f[1] * f[n-2];

如果出站后1排在第3个位置,由上面的结论知,在1前的一定是2和3,那么就是1入栈后不动,2和3随意,1出,剩余n-3个数随意,则num = f[2] * f[n-3];

…………

…………

以此类推,令f[0] = 1,则可推出公式。

注意:hdu1023结果数据很大,需要大整数处理。

 

posted on 2010-07-16 13:37  ylfdrib  阅读(2324)  评论(0编辑  收藏  举报