Catalan數與棧序列

2022-06-08 06:57:10 字數 1567 閱讀 8960

之前的作業裡有\([dh]\)裡的一道題, 問:你有1個棧\(s\), 乙個變數\(x\)可以用於儲存; 現有:

\(read(x)\) (每次操作將\(1\)~\(n\)之間的整數按照從小到大順序讀入\(x\)中,每個數隻\(read1\)次);

\(print(x)\);

\(push(x,s)\);

\(pop(x,s)\)四種操作.

求對於正整數\(n\),可以列印多少種\(1\)~\(n\)的全排列(原題問的是有多少種打不出來)?

\(solution:\)

\(如下程式:\)

read(x);

push(x,s);

pop(x,s);

print(x,s);

read(x);

print(x,s);

列印效果相同(問題轉化為\(n\)個元素進棧順序已知,求出棧序列數).

因此考慮前\(n\)個正整數的進棧與出棧構成的\(01\)序列(規定入棧為0,出棧為1),與列印的排列可以建立一一對映,只需要計算\(nums\_of(0)=nums\_of(1)=n\)的棧序列數即可.

其中,因為\(pop\)空棧非法, 對於棧序列的任意字首, 有\(nums\_of(0)\geqslant nums\_of(1)\).

答案是:\(\frac}\)

\(proof:\)

\[\begin

&顯然所有的01序列共有\tbinom種\\

&而對於所有的非法序列,我們建立函式f: \:\rightarrow \\

&\\\

&注意到flip()具有flip(flip(x))=x,x \in \的性質\\

&因此f有反函式, 是bijection.\\

&非法序列數=2n位中(n+1)位0和(n-1)位1的排列數=\tbinom\\

&合法序列數=\tbinom-\tbinom=\frac}

\end

\]\(即為第n個catalan數:c(n)=\frac}\)

還有乙個遞推公式:

分治:對乙個合法序列:找到第乙個\(nums\_of(0)=nums\_of(1)\)的字首(一定存在),則它與字尾都是合法序列.

而對於第乙個\(nums\_of(0)=nums\_of(1)\)的字首,等價於\(0++1\),

因此,第乙個長度為\(2n\)的\(nums\_of(0)=nums\_of(1)\)的字首的個數\(=c(n-1)\)

\[\begin

&補充定義:c(0)=1\\

&則c(n)=\sum_^ c(i-1)c(n-i)

\end

\]可以用這個公式dp求第(前)\(n\)個\(catalan\)數:

#include#define ll long long

#define rep(i,a,b) for(int i=a;i<=b;++i)

ll c[114514] ;

int main()

這其實是2023年全國三卷理科數學選擇題最後乙個.

洛谷P1044 棧(Catalan數)

棧是計算機中經典的資料結構,簡單的說,棧就是限制在一端進行插入刪除操作的線性表。棧有兩種最重要的操作,即pop 從棧頂彈出乙個元素 和push 將乙個元素進棧 棧的重要性不言自明,任何一門資料結構的課程都會介紹棧。寧寧同學在複習棧的基本概念時,想到了乙個書上沒有講過的問題,而他自己無法給出答案,所以...

Catalan數(卡特蘭數)

卡特蘭數 規定h 0 1,而h 1 1,h 2 2,h 3 5,h 4 14,h 5 42,h 6 132,h 7 429,h 8 1430,h 9 4862,h 10 16796,h 11 58786,h 12 208012,h 13 742900,h 14 2674440,h 15 969484...

卡特蘭數 Catalan數

卡特蘭數 規定h 0 1,而h 1 1,h 2 2,h 3 5,h 4 14,h 5 42,h 6 132,h 7 429,h 8 1430,h 9 4862,h 10 16796,h 11 58786,h 12 208012,h 13 742900,h 14 2674440,h 15 969484...