已知n个数的入栈序列,求一共有多少种出栈序列 (卡特兰数)
已知 个数的入栈序列,求一共有多少种出栈序列
这个经典问题有两种解法。
解法一
设
假设我们有
假如
假设
假设
同理,
那么我们就可以得到$f(4) = f(3) + f(1) f(2) + f(2)f(1) +f(3)$.
对于
不难发现这就是卡特兰数,这里就不在赘述了。
解法二
我们假设
首先来限定一些条件,一个合法的序列
了解了上面两个条件后,我们知道所有的序列数为
假设我们有一个序列
接下来,我们将序列开头到不合法下标的这一段进行取反。首先拿上面的例子来进行说明,取反后得到:
现在再来进行推广,我们截取的不合法序列段(从开头到不合法前缀和下标),这一段中的
不难发现,不合法的序列一定对应唯一一个取反后的序列,并且取反后的序列中
最后,合法的序列数为:
这个解法的关键在于,不合法的序列一定唯一对应一个取反后的序列,那么我们可以算出所有取反后的数列有多少种(根据
因为感觉这种解法非常的巧妙,因此来总结一下.