卡特蘭數 Catalan

2021-05-12 13:50:05 字數 1032 閱讀 3406

問題

《程式設計之美》第4.3節中提到了「買票找零」問題,查閱了下資料,此問題和卡特蘭數 cn有關,其定義如下:

卡特蘭數真是乙個神奇的數字,很多組合問題的數量都和它有關係,例如:

***yyy xyxxyy xyxyxy xxyyxy xxyxyy

((ab)c)d (a(bc))d (ab)(cd) a((bc)d) a(b(cd))

在《enumerative combinatorics》一書中,竟然提到了多達 66種組合問題和卡特蘭數有關。

分析「卡特蘭數」除了可以使用公式計算,也可以採用「分級排列法」來求解。以 n對括弧的合法匹配為例,對於乙個序列 (()而言,有兩個左括弧,和乙個右括弧,可以看成「抵消了一對括弧,還剩下乙個左括弧等待抵消」,那麼說明還可以在末尾增加乙個右括弧,或者乙個左括弧,沒有左括弧剩餘的時候,不能新增右括弧。

由此,問題可以理解為,總共 2n個括弧,求 1~2n級的情況,第 i 級儲存所有剩餘 i 個左括號的排列方案數。 1~8級的計算過程如下表:

計算過程解釋如下: 1級:只能放 1個「(」; 2級:可以在一級末尾增加乙個「)」或者乙個「 (」

以後每級計算時,如果遇到剩餘 n>0個「(」的方案,可以在末尾增加乙個「 (」或者「 )」進入下一級;遇到剩餘 n=0個「(」的方案,可以在末尾增加乙個「 (」進入下一級。

奇數級只能包含剩餘奇數個「(」的排列方案

偶數級只能包含剩餘偶數個「(」的排列方案

從表中可以看出,灰色部分可以不用計算。

解法關鍵**為:

double catalan(int n)

}return arr[0];

}

其中:

n為 cn中的 n;

arr = new double[n + 1];//arr[i]代表有 k個括弧的時候,剩餘 "("個數為 i的排列方案個數 arr[1] = 1;

討論演算法複雜度為= o(n^2),空間複雜度為 o(n+1)。相對於利用公式計算而言,此方法的優勢在於——沒有乘除法,只有加法。

catalan(卡特蘭)數

一 h n h 0 h n 1 h 1 h n 2 h n 1 h 0 其中n 2 h 0 h 1 1 h n 4n 2 n 1 h n 1 n 1 h 0 1 h n c 2n,n 一般情況 要取模 下的求法 簡單的catalan模板題 這個題要取1e9 7的模,直接按照公式h n 4n 2 n ...

Catalan數(卡特蘭數)

卡特蘭數 規定h 0 1,而h 1 1,h 2 2,h 3 5,h 4 14,h 5 42,h 6 132,h 7 429,h 8 1430,h 9 4862,h 10 16796,h 11 58786,h 12 208012,h 13 742900,h 14 2674440,h 15 969484...

卡特蘭數 Catalan數

卡特蘭數 規定h 0 1,而h 1 1,h 2 2,h 3 5,h 4 14,h 5 42,h 6 132,h 7 429,h 8 1430,h 9 4862,h 10 16796,h 11 58786,h 12 208012,h 13 742900,h 14 2674440,h 15 969484...