卡特蘭數: - -!
24、問題描述:
12個高矮不同的人,排成兩排,每排必須是從矮到高排列,而且第二排比對應的第一排的人高,問排列方式有多少種?
這個筆試題,很yd,因為把某個遞迴關係隱藏得很深.
問題分析:
我們先把這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的出現,我們考慮這乙個出現能不能放在第二排,顯然,在這個1之前出現的那些0,1對應的人
要麼是在這個1左邊,要麼是在這個1前面.而肯定要有乙個0的,在這個1前面,統計在這個1之前的0和1的個數.
也就是要求,0的個數大於1的個數.
ok,問題已經解決.
如果把0看成入棧操作,1看成出棧操作,就是說給定6個元素,合法的入棧出棧序列有多少個.
這就是catalan數,這裡只是用於棧,等價地描述還有,二叉樹的列舉,多邊形分成三角形的個數,圓括弧插入公式中的
方法數,其通項是c(2n, n)/(n+1)。
令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),這是n階遞推關係;
還可以化簡為1階遞推關係: 如h(n)=(4n-2)/(n+1)*h(n-1)(n>1) h(0)=1
該遞推關係的解為:h(n)=c(2n,n)/(n+1)=p(2n,n)/(n+1)!=(2n)!/(n!*(n+1)!)(n=1,2,3,...)
卡 塔蘭數例的前幾項為(sequence a 0 0 0 1 0 8 in oeis) [注: n = 0, 1, 2, 3, … n]
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …
我並不關心其解是怎麼求出來的,我只想知道怎麼用catalan數分析問題。
我總結了一下,最典型的三類應用:(實質上卻都一樣,無非是遞迴等式的應用,就看你能不能分解問題寫出遞迴式了)
1.括號化問題。
矩陣鏈乘: p=a0×a1×a2×a3×……×an,共有(n+1)項,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案?(h(n)種)
類似題目:有n個節點的二叉樹共有多少種情形?
2.出棧次序問題。
乙個棧(無窮大)的進棧序列為1,2,3,..n,有多少個不同的出棧序列?
類似題目:有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視作將5元入棧,持10元者到達視作使棧中某5元出棧)
形如這樣的直角三角形網格,從左上角開始,只能向右走和向下走,問總共有多少種走法?
問題的由來:編號為 1 到 n 的 n 個元素,順序的進入乙個棧,則可能的出棧序列有多少種?
對問題的轉化與思考:n 個元素進棧和出棧,總共要經歷 n 次進棧和 n 次出棧。這就相當於對這 2n 步操作進行排列。
乙個模型:乙個 n*n 的正方形網格,從左上角頂點到右下角頂點,只能向右走和向下走。問共有多少種走法。如果將向右走對應上述問題的出棧,向下走對應上述問題的進棧,那麼,可 以視此模型為對上述問題的具體描述。而解決此問題,只要在總共從左上角到右下角的2n步中,選定向右走的步數,即共有c(n 2n)中走法。
但是存在乙個問題,如果走法越過了對角線,那麼對應到上述問題是出棧數比入棧數多,這是不符合實際的。
對以上模型進行處理,對角線將以上正方形網格分成兩部分,只留下包含對角線在內的下半部分,那麼就不會出現越過對角線的問題。而這問題就是開始提出的問題。
問題等價於:n個1和n個0組成一2n位的2進製數,要求從左到右掃瞄,1的累計數不小於0的累計數,試求滿足這條件的數有多少?
解答: 設p2n為這樣所得的數的個數。在2n位上填入n個1的方案數為 c(n 2n)
不填1的其餘n位自動填以數0。從c(n 2n)中減去不符合要求的方案數即為所求。
不合要求的數指的是從左而右掃瞄,出現0的累計數超過1的累計數的數。
不合要求的數的特徵是從左而右掃瞄時,必然在某一奇數2m+1位上首先出現m+1個0的累計數,和m個1的累計數。
此 後的2(n-m)-1位上有n-m個1,n-m-1個0。如若把後面這部分2(n-m)-1位,0與1交換,使之成為n-m個0,n-m-1個1,結果得 1個由n+1個0和n-1個1組成的2n位數,即乙個不合要求的數對應於乙個由n-1個1和n+1個0組成的乙個排列。
反過來,任何乙個 由n+1個0,n-1個1組成的2n位數,由於0的個數多2個,2n是偶數,故必在某乙個奇數字上出現0的累計數超過1的累計數。同樣在後面的部分,令0 和1互換,使之成為由n個0和n個1組成的2n位數。即n+1個0和n-1個1組成的2n位數,必對應於乙個不合要求的數。
用上述方法建立了由n+1個0和n-1個1組成的2n位數,與由n個0和n個1組成的2n位數中從左向右掃瞄出現0的累計數超過1的累計數的數一一對應。
例如 10100101
是由4個0和4個1組成的8位2進製數。但從左而右掃瞄在第5位(顯示為紅色)出現0的累計數3超過1的累計數2,它對應於由3個1,5個0組成的10100010。
反過來 10100010
對應於 10100101
因而不合要求的2n位數與n+1個0,n-1個1組成的排列一一對應,故有
p2n = c(n 2n)— c(n+1 2n)
這個結果是乙個「卡塔蘭數」catalan
3.將多邊行劃分為三角形問題。
將乙個凸多邊形區域分成三角形區域的方法數?
類似題目:一位大城市的律師在她住所以北n個街區和以東n個街區處工作。每天她走2n個街區去上班。如果他
從不穿越(但可以碰到)從家到辦公室的對角線,那麼有多少條可能的道路?
類似題目:在圓上選擇2n個點,將這些點成對連線起來使得所得到的n條線段不相交的方法數?
1330 出棧序列統計 卡特蘭數
題目描述 按照1,2,n 1,n的順序入棧,問可以得到多少種出棧序列。如n 3時有1 2 3,1 3 2,2 1 3,2 3 1,3 2 1共5種出棧序列。解題思路 設f n 為n個數時的方案數。可知 f 0 1 f 1 1 f 2 2 f 3 5 當n 4時 f1 f2 f3 f4 1 2 3 4...
卡特蘭數計算,出棧序列可能個數,棧容量有限制
佇列中有從1到7 由小到大排列 的7個整數,問經過乙個整數棧後,出棧的所有排列數有多少?如果整數棧的容量是4 棧最多能容納4個整數 那麼出棧的排列數又是多少?public class catalan if sta 0 if deq 0 sta 0 public static void main st...
棧和卡特蘭數(Catalan number)
棧是計算機中經典的資料結構,我們也會遇到乙個常見的問題 一共有多少種合法的出棧順序?先說一下什麼是合法的出棧序列,凡是合法序列都遵循以下規律 即對於出棧序列中的每乙個數字,在它後面的 比它小的所有數字,一定是按遞減順序排列的。例如 有數字1 2 3 4 依次入棧,那麼他們的出棧順序中 所以到底有多少...