问题描述: n个不相同元素顺序输入到 一个栈, 栈可以里的元素可在任意时刻出栈. 求出栈的可能序列数.
这是一个填空题, 求出当N等于5的情况的可能序列数. 很容易可以得到N等于2,3,4 时的序列数为 2,5,14. 这可通过在已有序列的基础上添加下一元素的可能性来寻找规律.
当N为2时, 序列为 2,1 及 1,2. 当N为3时, 3可从2的序列中的最后插入, 第二个位置插入. 以及出现在2,1的前面. 如下图:
由此可得 当N为3时, 可能插入的位置为5, 即出栈序列的可能数 为 5. 再来看看当n为4时:
一共有14个位置可以插入. 共同的地方是最前只能插入一个, 最后及倒数第二个位置全都可以进行插入. 以及倒序输出的那个行的任意位置都可以进入插入. 此时, 输出的可能序列增加到了 14个. 那么当n为5 时, 可能输出的序列是多少个呢? 好吧, 我没找出规律来, 求解答.
当然, 这个问题可以解决, 那就依靠我们强大的计算机吧.
ruby代码如下:
a = [] #用来存放输出到栈中的数的
for i in 1 .. ARGV[0].to_i
a[i-1] = i
end
stack = []
printarray = [] #栈中输出先放至这个数组中, 满了就存放到vav中
vav = Array.new(){[]} #此也就是数组的数组, 存放合法的输出序列
def find(ith, stack, printarray, a, stack_push, vav)
stack = Array.new stack
printarray = Array.new printarray
if ith == ARGV[0].to_i #若顺序输出完毕, 则栈中全部出栈, 存入打印数组中
while !stack.empty?
printarray.push stack.pop
end
vav.push printarray
else
if stack_push
stack.push a[ith]
find(ith+1, stack, printarray, a, true, vav)
find(ith+1, stack, printarray, a, false, vav)
elsif !stack.empty?
printarray.push stack.pop
find(ith, stack, printarray, a, true, vav)
find(ith, stack, printarray, a, false, vav)
end
end
end
find(0, stack, printarray, a, true, vav)
vav.uniq! #除去vav中的重复序列
vav.each{|i|
p i
}
p vav.size
现在让我们来看来结果是什么, 首先先试一下 n 为3, 及 n 为 4 时. 如下:
结果是正确的, n 为5,6,7 时结果分别为: 42 , 132, 429.
详细的看一下wiki百科: 卡塔兰数