《演算法競賽高階指南》火車進出棧問題

2021-10-07 06:53:29 字數 1423 閱讀 1857

一列火車n節車廂,依次編號為1,2,3,…,n。

每節車廂有兩種運動方式,進棧與出棧,問n節車廂出棧的可能排列方式有多少種。

輸入格式

輸入乙個整數n,代表火車的車廂數。

輸出格式

輸出乙個整數s表示n節車廂出棧的可能排列方式數量。

資料範圍

1≤n≤60000

輸入樣例:

3輸出樣例:

5看到這種問題我們首先想到的方法就是模擬出棧進棧的操作在記錄符合的次數,而我們模擬的話實際運用的就是dfs搜尋,每一層dfs搜尋都有兩個方向(開頭和結尾不算的話),即搜尋的深度為最大60000,呼叫搜尋函式最多2^(60000*2);這明顯是不可行的。因此我們可以將進出棧運算元字化:111000(進進進出出出)

110010(進進出出進出)

110100(進進出進出出)

101100(進出進進出出)

101010(進出進出進出)

;//基礎資料範圍為60000,出入棧選擇範圍為120010。

ll res[n]

,tt;

//res陣列為高精度陣列,每一位高精度陣列壓位10^9,以最大資料(2n)!=(120000)!來說是足夠用的

//tt為高精度陣列的位數

int st[m]

;//st用於儲存冪指數表示方法的冪數次數,用於下一步的轉化成高精度陣列

bool q[m]

;//利用篩素數的方法q陣列內篩出2n範圍內的素數

intget

(int n,

int p)

void

multi

(ll b)

if(t)

//當最後又進製時高精度陣列長度加一,這裡長度最多加一。

res[

++tt]

=t;}

void

out(

)int

main()

res[0]

=1;for

(int i=

2;i<=

2*n;i++)if

(!q[i]

)out()

;return0;

}

火車進出站問題 棧

編號為1,2,n的n輛火車依次進站,給定乙個n的排 列,判斷是否是合法的出站順序?思路 先把出站順序存入,用棧模擬進站的火車,按照出站的順序,依次pop出來,判斷 最後的出站數量能否達到n。include include include using namespace std const int m...

演算法競賽高階指南 0x11 (棧)火車進棧

兩個操作圖中1操作是火車進棧,2是火車出棧,因為要按照字典序輸出,應該先執行操作2,執行操作1來保證字典序正確 直接用dfs來暴力模擬過程,即可輸出答案 include using namespace std int n,cnt 20 vector int state1 stack int stat...

棧 卡特蘭數 火車進出棧問題

傳送門 題意 一列火車n節車廂,依次編號為1,2,3,n。每節車廂有兩種運動方式,進棧與出棧,問n節車廂出棧的可能排列方式有多少種。資料範圍 1 n 60000 輸入樣例 3輸出樣例 5思路 進出棧問題 序列問題 路徑問題。這顯然是上一道火車進棧的公升級版,資料太大不能再進行遞迴處理了。問題轉換 尋...