進出棧序列問題詳解

2022-01-10 07:38:40 字數 1275 閱讀 5698

題目描述

一列火車n節車廂,依次編號為1,2,3,…,n。每節車廂有兩種運動方式,進棧與出棧,問n節車廂出棧的可能排列方式有多少種。

輸入描述:

乙個數,n(n≤60000)n (n \leq 60000)n(n≤60000)
輸出描述:
乙個數s表示n節車廂出棧的可能排列方式
示例1

輸入

3
輸出
5
示例2

輸入

50
輸出
1978261657756160653623774456
思路:

方案一:暴力列舉

對於棧問題,簡單來想只有進棧和出棧的操作

所以直觀的來看,直接暴力列舉每個節點情況

\(\begin1.把下乙個數進棧\\2.把當前棧頂元素出棧(如果棧非空)\end\)

利用遞迴快速實現,時間複雜度 :\(o(2^n)\)

在這個時間複雜度下很容易tle

方案二:遞推優化 \(o(n^2)\)

因為本題只是要求求出有多少種出棧序列並不關心具體方案,於是我們可以使用遞推直接進行統計。設\(s_n\) 表示進棧順序為 \(1,2,3,4...,n\) 時可能的出棧序列總數。

現在假設序列中位置 \(k\) 的地方有乙個數 \(a ,a\)前面有\(k−1\)個數要出棧,a後面有\(n−k\)個數要出棧,而出棧的方案總數分別是 $s_ $ 和 \(s_\) 於是這個大問題就轉化成了小問題,我們就要求更小的 \(s_i\),於是有遞推公式(很好理解):

方案三:動態規劃\(o(n^2)\)

動態規劃。這裡我們要有狀態與決策的思想(這個真的很重要,有時與搜尋也異曲同工)。我們設 \(f[i,j]\) 是還有 $i \(個元素未入棧,\)j$ 個元素在棧中的方案總數,初始狀態是\(f[0,0]=1\),目標狀態是\(f[n,0]f\),每一次我們的決策有「讓乙個數進棧」,「讓棧頂的數出棧」,所以方程有:

\[f[i,j]=f[i−1,j+1]+f[i,j−1]

\]方案四:數學\(o(n)\)、

該問題等價於求第 \(n\) 項 \(ctalan\)數,即 \(c^_ / (n + 1)\)

火車進出站問題 棧

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

火車進出站序列問題簡述

問題描述 假設有乙個站台,只有乙個進出口,有一列火車,車廂標號從頭往後依次是1,2,3,4。問火車從頭進入站台,有多少種出站台的序列。解題思路 這裡的站台可以模擬於資料結構中的棧。棧具有先進後出 後進先出的特點,因此,任何乙個排程結果應該是 全排列中的乙個元素。由於進棧的順序是由小到大的,所以出棧序...

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

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