1. 程式人生 > >N個數依次入棧,出棧順序有多少種

N個數依次入棧,出棧順序有多少種

轉載:https://blog.csdn.net/u010255818/article/details/62044402

題目
N個數依次入棧,出棧順序有多少種?

直接公式
令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(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2, 
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
遞推關係的解為:h(n)=C(2n,n)/(n+1) (n=1,2,3,...) 
遞推關係的另類解為:h(n)=C(2n,n)-C(2n,n+1)(n=1,2,3,...)

常規分析
1) 首先,我們設f(n)代表序列個數為n的出棧序列種數。同時,我們假定第一個出棧的序數是k。 

2) 第一個出棧的序數k將1~n的序列分成兩個序列:其中一個是1~k-1,序列個數為k-1;另外一個是k+1~n,序列個數是n-k。 

3) 此時,我們若把k視為一個確定的序數,那麼根據乘法原理,f(n)的問題就等價於序列個數為k-1的出棧序列種數乘以序列個數為n - k的出棧序列種數,即選擇k這個序數的出棧組合為f(k-1)×f(n-k)。 

4) 而k可以選1到n,所以再根據加法原理,將k取不同值的序列種數相加,得到的總序列種數為: 
f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0)。 

5) 看到此處,再看看卡特蘭數的遞推式,答案不言而喻,即為: 
f(n)=h(n)=C(2n,n)/(n+1)=C(2n,n)-C(2n,n+1), (n=1,2,3,……)。最後,令f(0)=1,f(1)=1。