一、Catalan數的定義
令h(0)=1,h(1)=1,Catalan數滿足遞歸式:h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)
該遞推關系的解為:h(n) = C(2n,n)/(n+1),n=0,1,2,3,... (其中C(2n,n)表示2n個物品中取n個的組合數)
二、問題描述
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序列有多少個。
觀察規律我們發現1的出現前邊必須有一個相應的0對應,所以從左到右的所有序列中0的個數要一直大於1的個數。那這種數列有多少種排列方式呢?
那么我們從左往右掃描,第一次出現1的個數等於0的個數是第k位,那么在此之前,0的個數是大於1的個數的。在此之后,0的個數也是大於1的個數的。所以第k位0和1的個數第一次相等的排列有他們這兩部分的個數相稱的結果。那么所有的k有多少種,則把它們相加起來,就是最后的排列數。這是一個遞歸的問題。
即 h(n)=h(0)×h(n-1)+h(1)*h(n-2)+...+h(n-1)*h(0)
如果把0看成入棧操作,1看成出棧操作,就是說給定6個元素,合法的入棧出棧序列有多少個。
在<<計算機程序設計藝術>>,第三版,Donald E.Knuth著,蘇運霖譯,第一卷,508頁,給出了證明:
問題大意是用S表示入棧,X表示出棧,那么合法的序列有多少個(S的個數為n)
顯然有c(2n, n)個含S,X各n個的序列,剩下的是計算不允許的序列數(它包含正確個數的S和X,但是違背其它條件)。
在任何不允許的序列中,定出使得X的個數超過S的個數的第一個X的位置。然后在導致並包括這個X的部分序列中,以S代替所有的X並以X代表所有的S。結果是一個有(n+1)個S和(n-1)個X的序列。反過來,對一垢一種類型的每個序列,我們都能逆轉這個過程,而且找出導致它的前一種類型的不允許序列。例如XXSXSSSXXSSS必然來自SSXSXXXXXSSS。這個對應說明,不允許的序列的個數是c(2n, n-1),因此h(n )= c(2n, n) - c(2n, n-1)。
三、遞推公式
1、給定n個數,有多少種出棧序列?
( 問題的形象描述:
飯后,姐姐洗碗,妹妹把姐姐洗過的碗一個一個放進碗櫥摞成一摞。一共有n個不同的碗,洗前也是摞成一摞的,也許因為小妹貪玩而使碗拿進碗櫥不及時,姐姐則把洗過的碗摞在旁邊,問:小妹摞起的碗有多少種可能的方式?
一個有n個1和n個-1組成的字串,且前k個數的和均不小於0,那這種字串的總數為多少?
P=A1A2A3……An,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案?)
2、n個節點的二叉樹有多少種構型?
3、有n+1個葉子的滿二叉樹的個數?
4、在n*n的格子中,只在下三角行走,每次橫或豎走一格,有多少中走法?
5、將一個凸n+2邊形區域分成三角形區域的方法數?
6、在圓上選擇2n個點,將這些點成對連接起來使得所得到的n條線段不相交的方法數?
7、n個長方形填充一個高度為n的階梯狀圖形的方法個數?
上面一些問題有些是同構的,但有些卻實在看不出聯系來,他們的答案卻都為卡特蘭數。