方法一
n = 1时,记出栈序列的个数f(1) = 1;
n = 2时,易知f(2) = f(1) + f(1) = 2; //12, 21
n = 3时,f(3) = f(2) + f(1) * f(1) + f(2); //123, 132, 213, 231, 321
…
n = k时,记f(0) = 1,则f(k) = f(0) *f(k-1) + … + f(k-1) *f(0)
方法二
若一次入栈操作记为‘1’,一次出栈操作记为‘0’,则每一个出栈序列对应一个由n个’1’和n个‘0’组成的组合数,且对该组合数从左至右进行扫描时,‘1’的个数始终不少于‘0’的个数。
对于一个非法的组合数,从左至右进行扫描时,一定存在m = 0,1,2,…,使得在第2m+1个元素时,有m个‘1’和m+1个‘0’;故后2(n-m)-1个元素一定由n-m个‘1’和n-m-1个‘0’组成,若将后2(n-m)-1个元素的‘1’和‘0’互换,则该组合数由n-1个‘1’和n+1个‘0’组成。相反,若该组合数由n-1个‘1’和n+1个‘0’组成,那么一定存在m = 0,1,2,…,使得第2m+1位之前的‘1’的个数少于‘0’的个数。
综上,n个元素顺序入栈,出栈序列的个数f(n) = C(2n,n) - C(2n, n-1) = C(2n,n)/(n+1)
方法三(卡特兰数)
满足h(0) = 1, h(1) = 1, h(n) = h(0) *h(n-1) + h(1) *h(n-2)… + h(n-1) *h(0)的数成为卡特兰数。
递推式的解为 C(2n, n) / (n + 1)或 C(2n, n) - C(2n, n - 1).
相似问题
1.买票找零
2n个人排队买票,其中n个人只有5元纸币,另n个人只有10元货币,票价5元。求有多少种方法使得每个10元顾客都能被找零。
2.n个1和n个-1组成一个数字串,求任意前k个数的和均不少于零的字串的个数。
结果:C(2n, n) / (n+1)