斐波那契数列、卡特兰数

一、斐波那契数列(兔子序列)

1, 1, 2, 3, 5, 8, 13, 21, ...

递推公式:f(1)=f(2)=1; f(n)=f(n-1)+f(n-2) (n>=3)

快速求f(n):矩阵快速幂(logn)

二、卡特兰数

1, 2, 5, 14, 42, 132, 429, 1430, 4862, ...

递推公式:h(0)=1, h(1)=1; h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)

通项公式:h(n)=\frac{1}{n+1}\binom{n}{2n}

应用:

进出栈问题栈是一种先进后出(FILO,First In Last Out)的数据结构.如下图1,1,2,3,4顺序进栈,那么一种可能的进出栈顺序是:1In→2In→2Out→3In→4In→4Out→3Out→1Out, 于是出栈序列为1,3,4,2

                                        

斐波那契数列、卡特兰数_第1张图片

那么一个足够大的栈的进栈序列为1,2,3,⋯,n时有多少个不同的出栈序列?

            我们可以这样想,假设k是最后一个出栈的数。比k早进栈且早出栈的有k-1个数,一共有h(k-1)种方案。比k晚进栈且早出栈的有n-k个数,一共有h(n-k)种方案。所以一共有h(k-1)*h(n-k)种方案。显而易见,k取不同值时,产生的出栈序列是相互独立的,所以结果可以累加。k的取值范围为1至n,所以结果就为h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0)。

            出栈入栈问题有许多的变种,比如n个人拿5元、n个人拿10元买物品,物品5元,老板没零钱。问有几种排队方式。熟悉栈的同学很容易就能把这个问题转换为栈。值得注意的是,由于每个拿5元的人排队的次序不是固定的,所以最后求得的答案要*n!。拿10元的人同理,所以还要*n!。所以这种变种的最后答案为h(n)*n!*n!。

参考:

斐波那契数列_IronWring_Fly的博客-CSDN博客

卡特兰数详讲_wookaikaiko的博客-CSDN博客

你可能感兴趣的:(算法)