之前的作業裡有\([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...