參考博客:http://blog.csdn.net/wuzhekai1985/article/details/6764858
設表示用下面的方法把凸多邊形區域分成三角形區域的方法數:在有n+1條邊的凸多邊形區域內通過插入在其中不相交的對角線而把它分成三角形區域。定義。則滿足遞推關係
這個遞推關係的解是:,這裏的叫做Catalan數。
那麼上面的遞推式的正確性我們可以簡單描述一下即可:
證明:這裏因爲表示按照上述規則劃分的三角形區域個數,那麼我們隨便選一條多邊形的一條邊作爲基邊,那麼
再在剩餘的n-1個點中選一個點,我們把所選的一條邊的兩點分別與所選的那一點連接起來,那麼多邊形被劃
分成3部分,一部分有k+1條邊,一部分有3條邊,另一部分有n-k+1條邊,那麼這樣就劃分成了子問題了,所
以按照這個思路可以證明遞推式成立。
那麼根據遞推式是如何推出Catalan數的通項公式呢?
這裏用到了生成函數:我們很容易寫出的生成函數
我們進一步計算
因爲有:,所以進一步得到:
,由於
所以有:,解之得到:
,另一個解不符合,捨去。
那麼根據牛頓二項式有:
那麼帶入化簡得到:
那麼我們最終得到:
所以:,這就是Catalan的推導過程。
卡特蘭數的應用
1、括號化問題
矩陣連乘:,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,問有幾種括號化的方案?
(h(n))
例如abcd ((ab)c)d,(a(bc))d,....
思路:n對括號相當於有2n個符號,n個左括號、n個右括號,可以設問題的解爲f(2n)。第0個符號肯定爲左括號,與之匹配的右括號必須爲第2i+1字符。因爲如果是第2i個字符,那麼第0個字符與第2i個字符間包含奇數個字符,而奇數個字符是無法構成匹配的。
通過簡單分析,f(2n)可以轉化如下的遞推式 f(2n) = f(0)*f(2n-2) + f(2)*f(2n - 4) + ... + f(2n - 4)*f(2) + f(2n-2)*f(0)。簡單解釋一下,f(0) * f(2n-2)表示第0個字符與第1個字符匹配,同時剩餘字符分成兩個部分,一部分爲0個字符,另一部分爲2n-2個字符,然後對這兩部分求解。f(2)*f(2n-4)表示第0個字符與第3個字符匹配,同時剩餘字符分成兩個部分,一部分爲2個字符,另一部分爲2n-4個字符。依次類推。
假設f(0) = 1,計算一下開始幾項,f(2) = 1, f(4) = 2, f(6) = 5。結合遞歸式,不難發現f(2n) 等於h(n)。
2、出棧次序問題
一個棧(無窮大)的進棧序列爲1,2,3,..n,有多少個不同的出棧序列?h(n-1)
思路:可以這樣考慮,首先通過括號化,將P分成兩個部分,然後分別對兩個部分進行括號化。比如分成(a1)×(a2×a3.....×an),然後再對(a1)和(a2×a3.....×an)分別括號化;又如分成(a1×a2)×(a3.....×an),然後再對(a1×a2)和(a3.....×an)括號化。
設n個矩陣的括號化方案的種數爲f(n),那麼問題的解爲
f(n) = f(1)*f(n-1) + f(2)*f(n-2) + f(3)*f(n-3) + f(n-1)*f(1)。f(1)*f(n-1)表示分成(a1)×(a2×a3.....×an)兩部分,然後分別括號化。
計算開始幾項,f(1) = 1, f(2) = 1, f(3) = 2, f(4) = 5。結合遞歸式,不難發現f(n)等於h(n-1)。
類似問題
a、有2n個人排成一行進入劇場,入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視作將5元入棧,持10元者到達視作使棧中某5元出棧)
b、n個1和n個0組成一個2n位的二進制數,要求從左到右掃描,0的累計數不小於1的累計數,求滿足條件的的數。
c、12個人排成兩排,每排必須是從矮到高排列,而且第二排比對應的第一排的人高,問排列方式有多少種?
我們先把這12個人從低到高排列,然後,選擇6個人排在第一排,那麼剩下的6個肯定是在第二排.用0表示對應的人在第一排,用1表示對應的人在第二排,那麼含有6個0,6個1的序列,就對應一種方案.
比如000000111111就對應着
第一排:0 1 2 3 4 5
第二排:6 7 8 9 10 11
010101010101就對應着
第一排:0 2 4 6 8 10
第二排:1 3 5 7 9 11問題轉換爲,這樣的滿足條件的01序列有多少個。與情況b一樣。
3、給定節點組成二叉樹的問題
給定N個節點,能構成多少種形狀不同的二叉樹?
思路:可以這樣考慮,根肯定會佔用一個結點,那麼剩餘的n-1個結點可以有如下的分配方式,T(0, n-1),T(1, n-2),...T(n-1, 0),設T(i, j)表示根的左子樹含i個結點,右子樹含j個結點。
設問題的解爲f(n),那麼f(n) = f(0)*f(n-1) + f(1)*f(n-2) + .......+ f(n-2)*f(1) + f(n-1)*f(0)。假設f(0) = 1,那麼f(1) = 1, f(2) = 2, f(3) = 5。結合遞推式,不難發現f(n)等於h(n)。
4.n*n棋盤從左下角走到右上角而不穿過主對角線的走法
5.n個+1和n個-1構成的2n項序列,其部分和總滿足:的序列的個數。
Catalan數的高精度處理:利用遞歸式: h(n)=((4*n-2)/(n+1))*h(n-1)
6.凸多邊形三角形劃分:在一個凸多邊形中,通過若干條互不相交的對角線,把這個多邊形劃分成了若干個三角形。任務是鍵盤上輸入凸多邊形的邊數n,求不同劃分的方案數f(n)。
比如當n=6時,f(6)=14.h(n-1)
7.在圓上選擇2n個點,將這些點成對連接起來使得所得到的n條線段不相交的方法數?h(n)
思路:以其中一個點爲基點,編號爲0,然後按順時針方向將其他點依次編號。那麼與編號爲0相連點的編號一定是奇數,否則,這兩個編號間含有奇數個點,勢必會有個點被孤立,即在一條線段的兩側分別有一個孤立點,從而導致兩線段相交。設選中的基點爲A,與它連接的點爲B,那麼A和B將所有點分成兩個部分,一部分位於A、B的左邊,另一部分位於A、B的右邊。然後分別對這兩部分求解即可。
設問題的解f(n),那麼f(n) = f(0)*f(n-2) + f(2)*f(n-4) + f(4)*f(n-6) + ......f(n-4)*f(2) + f(n-2)*f(0)。f(0)*f(n-2)表示編號0的點與編號1的點相連,此時位於它們右邊的點的個數爲0,而位於它們左邊的點爲2n-2。依次類推。
f(0) = 1, f(2) = 1, f(4) = 2。結合遞歸式,不難發現f(2n) 等於h(n)。