洛谷P1044 棧(Catalan數)

2022-04-02 04:11:26 字數 902 閱讀 8355

棧是計算機中經典的資料結構,簡單的說,棧就是限制在一端進行插入刪除操作的線性表。

棧有兩種最重要的操作,即pop(從棧頂彈出乙個元素)和push(將乙個元素進棧)。

棧的重要性不言自明,任何一門資料結構的課程都會介紹棧。寧寧同學在複習棧的基本概念時,想到了乙個書上沒有講過的問題,而他自己無法給出答案,所以需要你的幫忙。

寧寧考慮的是這樣乙個問題:乙個運算元序列,從1,2,一直到n(圖示為1到3的情況),棧a的深度大於n。

現在可以進行兩種操作,

1.將乙個數,從運算元序列的頭端移到棧的頭端(對應資料結構棧的push操作)

將乙個數,從棧的頭端移到輸出序列的尾端(對應資料結構棧的pop操作)

使用這兩種操作,由乙個運算元序列就可以得到一系列的輸出序列,下圖所示為由1 2 3生成序列2 3 1的過程。

(原始狀態如上圖所示)

你的程式將對給定的n,計算並輸出由運算元序列1,2,…,n經過操作可能得到的輸出序列的總數。

輸入格式:

輸入檔案只含乙個整數n(1≤n≤18)

輸出格式:

輸出檔案只有一行,即可能輸出序列的總數目

輸入樣例#1:

3
輸出樣例#1:

5
#include#include

using

namespace

std;

long

long h[20

];int

main()

P1044 棧(洛谷) 動態規劃

洛谷傳送門 p1044 這一題是一題很經典的動態規劃。在這裡我們知道,對於已經排到佇列中的元素對剩下的元素的排列種數沒有影響,因此僅需考慮在原佇列中的元素數目i和在棧中的元素數目j。若i為0,則待排元素的排列種數僅有一種,即將棧中的元素全部彈出。若i不為0,則dp i j dp i 1 j 1 從原...

洛谷P1044棧 卡特蘭數

題意不再贅述 這道題是一道卡特蘭數的應用,為何是卡特蘭數呢?我們觀察一下整個過程,假設現在要最後站的是p,比他小的先出棧的有p 1個,所以方案數是f p 1 比他大的有n p個,所以方案數為f n p 我們會發現這兩部分互相影響,根據乘法原理,總方案數應該為f p 1 f n p p的取值有n種,這...

洛谷P1044 卡特蘭數

n個數依次進棧,可隨機出棧。求有幾種可能。卡特蘭數原理 首先建立陣列f,f i 表示i個數的全部可能性 f 0 1,f 1 1 當n 0,n 1時當然只有1種可能。設x為當前出棧的最後乙個數,x有n種取值可能。x是最後乙個出棧的,所以可以將已經出棧的數分為兩部分 1.比x小 2.比x大 比x小的數有...