标签:
题目描述:
按照1,2,...,n-1,n的顺序入栈,问可以得到多少种出栈序列。如n=3时有1 2 3,1 3 2,2 1 3,2 3 1,3 2 1共5种出栈序列。
解题思路:
设f(n)为n个数时的方案数。
可知 f(0)=1; f(1)=1; f(2)=2; f(3)=5;
当n=4时 :
F1 F2 F3 F4
1 2 3 4 //四种状态分别标记为F1,F2,F3,F4
若F1 位于一号位置 则之前的数字出栈顺序的情况数为F(0),在一号位置后的数字出栈顺序的情况数为f(3);
则F1 位于一号位置时方案总数为f(0)*f(3);
若F1 位于二号位置 则F1之前的位置的数字出栈顺序的情况数可知为f(1),在二号位置之后的数字的出栈顺序为f(2)。
则F1位于二号位置时方案总数为f(1)*f(2);
同理:F1位于三号位置时 方案数为 f(2)*f(1);
F1位于四号位置时 方案数为f(3)*f(0);
由上述条件可以推出:
f(4)=f(0)*f(3)+f(1)*f(2)+f(2)*f(1)+f(3)*f(0);
则当n未知时由以上结论可推:
f(n)=f(0)*f(n-1)+f(1)*f(n-2)+f(2)*f(n-3)......f(n-2)*f(1)+f(n-1)*f(0);
以上就是本题的一般递推式,我们会发现 这个式子的实际时间复杂度为O(n^2);
当然不是很快,于是我们引入 卡特兰数;
所谓卡特兰数 就是 当递推式中出现 h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2) 时,
可知代数式的解为 h(n)=C(2n,n)/(n+1) (n=0,1,2,...);
它的另类递推式为 h(n)=h(n-1)*(4*n-2)/(n+1); //本人数学弱渣 具体怎么推导请找百度君
于是乎我们的式子就化简为了 f(n)=f(n-1)*(4*n-2)/(n+1);// 优先级一定不要搞错 优先级害我找了好久bug
标签:
原文地址:http://www.cnblogs.com/PengGG/p/4789929.html