解法①:遞推法
有n個位置,現在任意選定乙個數,比如1,那麼1可以在1-->n的任意乙個位置上。假設1在第k的位置上,顯然在1的前面有k-1個數,並且這些數的數值為2-->k,在1後面有n-k個數。用f(k)表示k個數順序入棧後的出棧順序,則f(n)就是我們要求的最終答案。而f(n)這個事件又可以分解成1在1-->n這n個位置上出現的n種情況,於是根據加法/乘法原理,易得f(n)is catalan number.
解法②:遞迴法
在入棧和出棧過程中,任意乙個元素有3種情況:已在序列中/等待進棧/已進棧。於是用f(k,m)表示
有k個數等待進棧,m個數已進棧。f(n,0)=f(n-1,1) ;
f(n-1,1)=f(n-1,0)+f(n-2,2)....
解法③:組合數學
對於乙個數來說,只有入棧和出棧兩種操作,記入棧為1,出棧為0.共n個數,因此有2n種操作,n個0,n個1,因此全排列有c(n,2n)種,再去掉不符合要求的數:從左向右掃瞄出現0的累計數超過1的累計數。必然在摸乙個奇數字上2m+1位上首先出現m+1個0累計數和m個1累計數,此後的2n-(2m+1)位子有n-m個1,n-m-1個0.若把
2n-(2m+1)0與1交換,使之成為n-m個0,n-m個1.則整個序列就變成:n+1個0,n-1個1組成的2n位數。即乙個不合要求的數對應於乙個由n-1個0,n+1個1組成的乙個排列。所以答案就是
c(n,2n)-c(n+1,2n).
N個數依次入棧,出棧順序有多少種?
對於每乙個數來說,必須進棧一次 出棧一次。我們把進棧設為狀態 1 出棧設為狀態 0 n個數的所有狀態對應n個1和n個0組成的2n位二進位制數。由於等待入棧的運算元按照1 n的順序排列 入棧的運算元b大於等於出棧的運算元a a b 因此輸出序列的總數目 由左而右掃瞄由n個1和n個0組成的2n位二進位制...
N個數依次入棧,出棧順序有多少種?
對於每乙個數來說,必須進棧一次 出棧一次。我們把進棧設為狀態 1 出棧設為狀態 0 n個數的所有狀態對應n個1和n個0組成的2n位二進位制數。由於等待入棧的運算元按照1 n的順序排列 入棧的運算元b大於等於出棧的運算元a a b 因此輸出序列的總數目 由左而右掃瞄由n個1和n個0組成的2n位二進位制...
N個數依次入棧,出棧順序有多少種?
對於每乙個數來說,必須進棧一次 出棧一次。我們把進棧設為狀態 1 出棧設為狀態 0 n個數的所有狀態對應n個1和n個0組成的2n位二進位制數。由於等待入棧的運算元按照1 n的順序排列 入棧的運算元b大於等於出棧的運算元a a b 因此輸出序列的總數目 由左而右掃瞄由n個1和n個0組成的2n位二進位制...