【數學】組合數學 - 卡特蘭數

purinliang發表於2024-04-12

父級頁面:【數學】組合數學

卡特蘭數

記號為 \(H_n\) 第n個卡特蘭數,下面的n就是指這個。

\(H_0=1, H_1=1, H_2=2, H_3=5, H_4=14, H_5=42\)

卡特蘭數最常見的場景是合法的括號序,還有棧進出的方案。他們的特點就是“右括號”、“出棧”的次數不能超過剩餘的“左括號”、“入棧”的次數。這個可以用一個叫做反射法的方法統計。

圓上2n個點,用n條線段,每個點連1條線段,然後一共有多少種方法。連線的兩個點,左端點認為是入棧,右端點是出棧,所以對應到上面的問題。

n+2個頂點的凸多邊形的三角剖分。這個還是用O(n)遞推公式去理解好了。固定(1,2)這條邊為底,它屬於哪個三角形?三角形的頂點有n+1種選法。確定這個頂點之後會遞迴給兩側的小多邊形。也就是

\[H_n=H_0H_{n-1}+H_1H_{n-2}+H_3H_{n-3}+\cdots+H_{n-1}H_0 \]

其中 \(H_0 = 1\)

這個公式用“向上或向右走格點的方案”也挺好證明的。列舉這條路徑上除了路徑端點外,第一次到達y=x的點,設其橫座標為i,顯然其縱座標也為i。由於是“第一次到達”,所以套用下文的“i步向上和i步向右的除端點外不接觸y=x的方案數”,也就是 \(H_{i-1}\),在i之後,不再需要不接觸y=x,只需要不穿過y=x,所以後續的n-i步對應 \(H_{n-i}\) ,所以:

\[H_n=\sum\limits_{i=1}^{n} H_{i-1}H_{n-i} \]

n個相同的節點組成的二叉樹。遍歷當前節點的時候入棧,在進入右子樹的之前要先把當前節點及其之前的彈出,唯一對應這個棧。

可以說,如果不考慮非法的方案,如果有n個左括號和n個右括號,顯然方案是 \(C_{2n}^n\) ,那麼非法的方案呢?

如果以左括號為縱座標+1,右括號為橫座標+1,上面的合法方案相當於是整條線都在y=x直線以上。考慮非法的方案,一定有第一個橫座標+1跨過了y=x的線,考慮在這個第一個越過y=x的點之後,一定到達的是y=x-1的線,把後續的整條線按y=x-1翻轉(相當於是左右一一對應互換,所以計數一樣),翻轉之後的終點在(n+1, n-1),所以方案數是 \(C_{2n}^{n-1} = C_{2n}^{n+1}\)

所以合法的方案數 \(H_n = C_{2n}^{n} - C_{2n}^{n-1}\)

展開這個式子

\[H_n = C_{2n}^{n} - C_{2n}^{n-1} = \frac{(2n)!}{(2n-n)!n!} - \frac{(2n)!}{(2n-(n-1))!(n-1)!} \]

\[= \frac{(2n)!}{n!n!} - \frac{(2n)!}{(n+1)!(n-1)!} = \frac{(2n)!(n+1)}{n!n!(n+1)} - \frac{(2n)!n}{(n+1)!(n-1)!n} =\frac{(2n)!(n+1)}{n!(n+1)!} - \frac{(2n)!n}{(n+1)!n!} \]

\[=\frac{(2n)!(n+1) - (2n)!n}{n!(n+1)!} \]

\[=\frac{(2n)!((n+1) - n)}{n!(n+1)!} \]

\[=\frac{(2n)!}{n!(n+1)!} \]

\[=\frac{(2n)!}{n!n!(n+1)} = \frac{C_{2n}^n}{n+1} \]

同理

\[H_n =\frac{(2n)!}{n!n!(n+1)} \]

\[=\frac{(2n)(2n-1)(2(n-1)!}{n\cdot n\cdot (n-1)!(n-1)!\cdot (n+1)} \]

\[=\frac{(2n)(2n-1)C_{2(n-1)}^{n-1}}{n\cdot n\cdot (n+1)} \]

\[=\frac{(2n)(2n-1)H_{n-1}}{n\cdot (n+1)} \]

\[=\frac{4n-2}{n+1}\cdot H_{n-1} \]

與這個方法類似的計數方式就是“向上或者向右的格點路徑計數”,“不越過某條線”這個條件就等價於第一次越過這條線之後的每一步都沿著這條線的最近的平行線做一個對稱,可以解決諸如“所有元素都是+1和-1(數量不一定相等)”,比如n個+1和m個-1,求有多少種排列方式使其字首和最低時不低於k(k<=0)。就是把第一次觸碰到k-1之後的+1和-1全部符號變成相反數。如果不進行這個操作的話最後和為n-m,方法數為C(n+m,n)。其實就是把終點(n,m)按某條表示限制字首和的直線對稱,得到的點就是結果。

除端點外不接觸y=x的n步向上和n步向右的路徑數:易知第一步一定是向上,最後一步一定是向右,然後變成從(0,1)到(n-1,n),不穿過直線y=x+1的路徑數,即 \(H_{n-1}\)

相關文章