方法一
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)
元素出棧 入棧順序的合法性
元素出棧 入棧順序的合法性。如入棧的序列 1,2,3,4,5 出棧序列為 4,5,3,2,1 很直觀的一種想法,建立乙個輔助棧,把輸入的第乙個序列中的數字一次壓入該輔助棧,並按照第二個序列的順序從該棧中彈出數字。遍歷出棧順序中的元素,有兩種情況 1 如果元素是棧頂的元素,則pop出來 2 如果不是棧...
元素出棧 入棧順序的合法性。
1.基礎題 元素出棧 入棧順序的合法性。如 入棧的序列 1,2,3,4,5 出棧序列為 4,5,3,2,1 則合法。入棧的序列 1,2,3,4,5 出棧序列為 4,5,2,3,1 則不合法。include include include using namespace std input為入棧序列,...
元素出棧 入棧順序的合法性
問題描述 判斷元素出棧 入棧順序的合法性。如入棧的序列 abcde 出棧序列為 deabc 思路 定義兩個陣列分別來存放入棧和出棧序列 步驟1 先將字串1的第乙個字元入棧 步驟2 將該元素與字串2的第乙個元素進行比較 步驟3 a 如果相等,就將該元素出棧並且將字串1的下乙個字元入棧,與字串2的下乙個...