題目描述
一列火車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思路 進出棧問題 序列問題 路徑問題。這顯然是上一道火車進棧的公升級版,資料太大不能再進行遞迴處理了。問題轉換 尋...