問題
《程式設計之美》第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...