1. 程式人生 > >演算法學習——卡特蘭數

演算法學習——卡特蘭數

聯賽前複習一點東西吧。。。

計算公式:

  \[h_{n} = h_{0} \cdot h_{n - 1} + h_{1} \cdot h_{h - 2} + ... + h_{n - 1} \cdot h_{0}\]
  \[h_{n} = h_{n - 1} \cdot (4n - 2) / (n + 1)\]
  \[h_{n} = \frac{\binom{2n}{n}}{n + 1} = \frac{C_{2n}^{n}}{n + 1}\]
  \[h_{n} = \binom{2n}{n} - \binom{2n}{n+1}\]

常見應用

  1,出棧序列方案數。

  思路:對於第一個出棧的元素k,可以看做k把1~n的序列分成了1~k - 1 和 k + 1 ~ n.分出來的小序列長度分別為k - 1和n - k.於是可以看做2個新的子問題。通過列舉k,可以得到
  \(f_{n} = f_{0} \cdot f_{n - 1} + f_{1} \cdot f_{n - 2} + ... + f_{n - 1} \cdot f_{0}\)

.即卡特蘭數.
  相似的問題還有\(S = a_{1} \cdot a_{2} \cdot ... \cdot a_{n}\)這個表示式有多少種加括號的方式,也是可以列舉第一次加括號把剩下的部分分別分成了多大的2部分,然後變成2個子問題求解。
  還可以用一一對應原則來證明:
    一個合法的出棧序列可以看做一串長為2n的01串,設1表示入棧,0表示出棧,那麼合法序列必須滿足對於任意位置,字首中1的個數 >= 字首中0的個數。
    如果不考慮這個限制,一個長為2n,有n個1,n個0的01串的數量為\(\binom{2n}{n}\).再考慮除去不合法的情況。
    對於任意不合法串,一定可以找到第一個使得串不合法的位置,恰好滿足有\(m + 1\)
個0,m 個1.那麼這個位置後面就還有\(2n - m - 1 - m = 2(n - m) - 1\)個數,其中有\(n - m\)個1,\(n - m - 1\)個0.如果我們將後面這\(2(n - m) - 1\)個數01反轉,那麼後面就會有\(n - m\)個0,\(n - m - 1\)個1.與前面部分共同組成一個由\(n + 1\)個0和\(n - 1\)個1構成的01串。可以證明每一個這樣的01串都恰好對應了一個不合法串。因此不合法串的方案數與這樣的01串個數相同,即\(\binom{2n}{n + 1}\)
    那麼合法的方案數即為\(\binom{2n}{n} - \binom{2n}{n + 1} = h_{n}\)

2,括號匹配方案數

  n對括號的匹配方案數恰好為\(h_{n}\)
  思路:相當於有2n個符號,n個左括號,n個右括號。且每個左括號匹配時,必須使得被匹配上的右括號與當前左括號中間的字元數為偶數,否則就不合法了。
  於是可以列舉第一個被匹配上的括號是哪一個,若第0個與第1個匹配,那麼剩下的2部分就是一個長度為0,一個長度為2n - 2,因此方案數為\(f_{0} \cdot f_{2n - 2}\),以此類推可以得到表示式\(f_{2n} = f_{0} \cdot f_{2n - 2} + f_{2} \cdot f_{2n - 4} + ... + f_{2n - 2} \cdot f_{0}\)
  算一下可以發現\(f_{2n} = h_{n}\).其實上面的出棧序列也可以看做一個元素即為一對括號,入棧 = 左括號,出棧 = 右括號。也可以採用同樣的遞推方式.

3,n個節點構成的二叉樹個數

  方案數為\(h_{n}\)
  思路:首先root佔一個點,然後列舉左右兒子分別有多少個點,最後的式子化出來即為卡特蘭數

4,在圓上選擇2n個點,將這些點分成很多個點對兩兩相連使得得到的n條線段不相交的方案數。

  方案數為\(h_{n}\).
  思路:類似與括號匹配問題,列舉一個點與哪個點匹配,將剩下的點分成了點數分別為多少的2個部分。因為要求線段兩兩不相交,所以被分割出來的每一部分的點數都必須為偶數,否則一定會有點被孤立出來並且必須跟另一部分連邊。

5,凸多邊形劃分成多個三角形的方案數。

  方案數為\(h_{n - 2}\).
  思路:隨意選一條邊,然後在剩餘頂點中隨便選一個構成一個三角形,然後這個三角形把原圖形分割成2部分,繼續遞迴求解。

6,2n個人排隊買票,票價5元,n個人有一張5元,n個人有1張10元。問使得每個有10元的人買票時都可以有零錢返還的方案數。

  方案數為\(h_{n}\)
  思路:類似與括號匹配,相當於每個10元的人,都必須在它前面有一個5元跟他匹配。於是就轉化為了括號匹配問題。
  也可以轉化為二維平面上的問題。從左下角走到右上角,向右走為5元,向上為10元,那麼目的就是求從左下角走到右上角,不經過對角線的方案數。

7,用n個長方形填充一個高度為n的階梯狀圖形的方法個數。

  20130503162403523.png
  方案數為\(h_{n}\).
  思路:不知道、、、、