1. 程式人生 > 其它 >「數學」卡特蘭數

「數學」卡特蘭數

洛谷P1044 [NOIP2003 普及組] 棧

定義

經典問題:出棧序列數

由棧性質可得,某一時刻總操作的入棧數不能少於出棧數,若將入棧視為\(+1\),出棧視為\(-1\),則任意時刻該序列字首和不能小於零,且\(+1\)\(-1\)總數相等(均為\(n\)

如何求序列方案數

公式

易得,不剔除非法序列的情況下,序列總方案數為\(\dbinom{2n}{n}\)

對於任意非法序列,例如:

\[+1,-1,-1,+1,+1,-1 \]

若找到最先處於非法狀態的位置(字首和小於零的位置),將該位置(例子中的第三個)以及之前的數字全部反轉,則會得到一個由\(n+1\)\(+1\)\(n-1\)\(-1\)

構成的序列

\[-1,+1,+1,+1,+1,-1 \]

反轉後的序列在第一個字首和大於零的位置反轉可得到反轉前的序列,所以每個非法序列和\(n+1\)\(+1\)\(n-1\)\(-1\)構成的序列一一對應

由此得到合法序列數

\[Cat_n=\dbinom{2n}{n}-\dbinom{2n}{n-1}=\frac{\dbinom{2n}{n}}{n+1} \]

可以推出遞推式

\[Cat_1=1,Cat_n=\frac{\dbinom{2n}{n}}{n+1}=\frac{\dbinom{2n-2}{n-1}*\frac{2n*(2n-1)}{n*n}}{n+1}=\frac{\dbinom{2n-2}{n-1}}{n}*\frac{2n*(2n-1)}{n*(n+1)}=Cat_{n-1}*\frac{4n-2}{n+1} \]

還可以拆開

\[Cat_n=\frac{\prod(4*i-2)}{(n+1)!} \]

另一種形式:

\[Cat_n=\sum_{i=1}^{n}Cat_{i-1}*Cat_{n-i} \]

若列舉最後一個出棧點的編號\(i\),那麼在\(i\)入棧之前,前\(i-1\)個數字必定已經出棧,方案數為\(Cat_{i-1}\),在\(i\)出棧前,後\(n-i\)個數字也已經出棧,方案為\(Cat_{n-i}\)

由於沒有除法,寫高精方便,且遇到該形式的遞推式可以歸納到卡特蘭數

用法

輸入\(3\)輸出\(5\)即為卡特蘭數

待更

拓展

\(n\)\(+1\)\(m\)\(-1,(n≥m)\),求任意字首和不小於零的方案數

易證

\[ans=\dbinom{n+m}{m}-\dbinom{n+m}{n+1} \]