組合數學 卡特蘭數總結

2021-07-27 04:21:54 字數 1622 閱讀 3243

卡特蘭數

問題:

n對括號有多少種合法的匹配方式?(卡特蘭數的常見應用之一)

結論:

對於n對括號,合法的排列共有c(n,2n)-c(n+1,2n)

基本思路

考慮n對括號,有n個(和n個),對於任意乙個)其前面必定有乙個(跟他對應,如果沒有則是非法序列。也就是說,對於),其前面的(的數量必須大於等於)的數量。假設(=1,)=-1。合法的序列是 1 -11 -1 1 -1,不合法的序列是1 -1 -1 1 1 -1。n對括號的全排列數為c(n,2n),減掉那些不合法的排列數就得到了合法的排列數,那麼不合法的排列數怎麼得到呢?觀察上面不合法的序列1 -1 -1 1 1 -1,從第3個數開始,)的個數比(大1,因此,後面的(的個數也會比)大1。我們把1到3的數翻轉一下,變成-1 1 1 1 1 -1,得到乙個有n+1個1,n-1個-1的序列。這樣的序列總共有c(n-1,2n)或者c(n+1,2n)種,

我們可以得出這樣乙個結論:對於所有有n+1個1,n-1個-1的序列,都存在乙個轉折點k,在k之前1的數量比-1的數量大1,在k之後1的數量比-1的數量大1。我們只需要從第1個到第k個元素翻轉回去,就能變成對於有n個1,n個-1的情況下的非法排列。因此我們可以得到非法排列的個數為c(n,2n)-c(n+1,2n)。

卡特蘭數公式

令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)

另類遞推式[2]:h(n)=h(n-1)*(4*n-2)/(n+1);

遞推關係的解為:h(n)=c(2n,n)/(n+1) (n=0,1,2,...)

遞推關係的另類解為:h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)

可以利用卡特蘭數解決的常見問題:

乙個棧(無窮大)的進棧序列為1,2,3,…,n,有多少個不同的出棧序列?

在n*n的格仔中,只在下三角行走,每次橫或豎走一格,有多少中走法?

將乙個凸n+2邊形區域分成三角形區域的方法數?

圓上選擇2n個點,將這些點成對連線起來使得所得到的n條線段不相交的方法數?

有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零? ……

求卡特蘭數的**:

#include #includeint a[105][1000];//大數運算 

int b[105]; //儲存對應卡特蘭數有多少位

void catalan() //求卡特蘭數

while(carry) //進製處理

carry = 0;

for(j = len-1; j >= 0; j--) //除法

while(!a[i][len-1]) //高位零處理

len --;

b[i] = len;

}}int main()

printf("\n");

}}

組合數學 卡特蘭數

我們以一道題為例來介紹卡特蘭數 給定n n 個0 0 和n n個1 1,它們將按照某種順序排成長度為2 n 2n的序列,求它們能排列成的所有序列中,能夠滿足任意字首序列中0 0的個數都不少於1 1的個數的序列有多少個。輸出的答案對109 7 109 7取模。109 7 為了便於解決,我們可以把這個問...

神奇的組合數學 卡特蘭數

定義 令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 通項公式 證明如下 摘自taocp的原練習題 數競黨很少用不嚴格證明的定理 1.括號對 合法的括號對對數答案為h n 2.二叉樹 合法的樹有答案為h n 3.分多邊...

數學 組合數學 Lucas定理 卡特蘭數

n n的方格,從左上到右下畫一條線。乙個機械人從左上走到右下,只能向右或向下走。並要求只能在這條線的上面或下面走,不能穿越這條線,有多少種不同的走法?由於方法數量可能很大,只需要輸出mod 10007的結果。卡特蘭數 lucas定理 此題就是乙個模板題 include include include...