问题引入:
在学习卡特兰数的时候,两个经典的例子分别是括号匹配和栈混洗。它们都用到了一个相同的递推公式:
f(n) = ∑ f(k-1) * f(n-k) k = 1, 2, 3…, n
这个式子乍看很合理,但是仔细想来又觉得可能会有重复的情形。
本文将分析这个递推式的含义。
递推公式:
f(n) = ∑ f(k-1) * f(n-k) k = 1, 2, 3…, n
栈混洗问题:
这个公式的意义是,对**第一个入栈元素的出栈时机(即第一次栈为空的时机)**进行分类讨论:
比如对于1, 2, 3, 4… 进行操作序列push push pop pop …
栈的变化为
[1 )
[1, 2)
[1 )
[)
此时k = 2, 它对应两次pop之后栈为空的情况。
可以看出,前k-1个元素出栈的顺序跟后n-k个元素出栈顺序无关
所以对于任意k,其所对应的总出栈情况为f(k-1)*f(n-k)
那么在1出栈之前,栈始终是非空的。所以并不可能在前k-1次pop之后,栈变空,并使重复的情况出现。
括号匹配问题:
这里分类的依据是第一个左括号对应右括号的位置
其余分析与栈混洗类似,不再赘述