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

2021-09-08 11:22:08 字數 1709 閱讀 1239

對於每乙個數來說,必須進棧一次、出棧一次。我們把進棧設為狀態『1』,出棧設為狀態『0』。n個數的所有狀態對應n個1和n個0組成的2n位二進位制數。由於等待入棧的運算元按照1‥n的順序排列、入棧的運算元b大於等於出棧的運算元a(a≤b),因此輸出序列的總數目=由左而右掃瞄由n個1和n個0組成的2n位二進位制數,1的累計數不小於0的累計數的方案種數。

在2n位二進位制數中填入n個1的方案數為c(2n,n),不填1的其餘n位自動填0。從中減去不符合要求(由左而右掃瞄,0的累計數大於1的累計數)的方案數即為所求。不符合要求的數的特徵是由左而右掃瞄時,必然在某一奇數字2m+1位上首先出現m+1個0的累計數和m個1的累計數,此後的2(n-m)-1位上有n-m個 1和n-m-1個0。如若把後面這2(n-m)-1位上的0和1互換,使之成為n-m個0和n-m-1個1,結果得1個由n+1個0和n-1個1組成的2n位數,即乙個不合要求的數對應於乙個由n+1個0和n-1個1組成的排列。

反過來,任何乙個由n+1個0和n-1個1組成的2n位二進位制數,由於0的個數多2個,2n為偶數,故必在某乙個奇數字上出現0的累計數超過1的累計數。同樣在後面部分0和1互換,使之成為由n個0和n個1組成的2n位數,即n+1個0和n-1個1組成的2n位數必對應乙個不符合要求的數。

因而不合要求的2n位數與n+1個0,n-1個1組成的排列一一對應。

顯然,不符合要求的方案數為c(2n,n+1)。由此得出輸出序列的總數目=c(2n,n)-c(2n,n+1)=c(2n,n)/(n+1)=h(n+1)。

//模擬過程如下,dfs來填充入棧和出棧的標誌

#include#include

#include

#include

#define n 100

using

namespace

std;

inta[n];

int p[2*n];

int pre[2*n];

int used[2*n];

int index[2*n];//

如果a[i]==1,那麼表示第index[i]個數入棧

intn;

int cnt;//

記錄多少個出棧的序列

int c(int

n)

return ans/(nn+1);}

void

solve()

else

}cout

<}void

solve1()

}cout

<}void dfs(int k, int cnt0, int

cnt1)

if(cnt1//

入棧 a[k] = 1

; index[k] = cnt1+1;//

第幾個數入棧

dfs(k+1, cnt0, cnt1+1

); }

if(cnt0//

出棧 a[k] = 0

; dfs(k+1, cnt0+1

, cnt1);

}}int

main()

類似問題 買票找零

有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視作將5元入棧,持10元者到達視作使棧中某5元出棧)

最終結果:c(2n,n)-c(2n,n+1)

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位二進位制...

1 5入棧順序有多少種可能出棧結果

方法一 a.1個元素入棧出棧一種可能記作f 1 1 b.2個元素入棧出棧有兩種可能記f 2 2 c.3個元素入棧,考慮最後乙個元素,出棧為第乙個位置1種,第二個位置2種,第三個位置f 2 種,記作f 3 5 d.4個元素入棧,考慮最後乙個元素,出棧為第乙個位置1種,第二個位置 前面只有乙個元素pop...