卡特蘭數列程式設計實現

2021-08-21 03:47:16 字數 1122 閱讀 6368

卡特蘭(catalan)數列典型特徵有一類如下:

1. 可以分為兩列

2. 每行從左向右依次遞增(減),每列從上向下依次遞增(減)

/*

2-10 標準二維表問題

問題為:設n是乙個正整數。2*n的標準二維表是由正整數1,2,…2n組成的2*n陣列,該陣列的每行從左到右遞增,每列從上到下遞增。

把數字從小到大進行排序,

用0表示對應的數字在第一排,用1表示對應的數字在第二排,那麼含有n個0,n個1的序列,就對應一種方案.

比如000111就對應著

第一排:1 2 3

第二排:4 5 6

010101就對應著

第一排:1 3 5

第二排:2 4 6

問題轉換為,這樣的滿足條件的01序列有多少個。

任意的1前面,統計在這個1之前的0和1的個數,要求0的個數大於1的個數。

顯然有c(2n, n)個含0,1各n個的序列,剩下的是計算不允許的序列數(它包含正確個數的0和1,但是違背其它條件)。

在任何不允許的序列中,定出使得1的個數超過0的個數的第乙個1的位置。

然後在導致幷包括這個1的部分序列中,以0代替所有的1並以1代表所有的0。

結果是乙個有(n+1)個0和(n-1)個1的序列。

反過來,對於(n+1)個0和(n-1)個1組成的每個序列,我們都能逆轉這個過程,而且找出導致它的前一種型別的不允許序列。

例如1101 0001 1000必然來自0010 1111 1000

這個對應說明,不允許的序列的個數是c(2n, n-1),

因此an = c(2n, n) - c(2n, n-1)。

該問題就是:卡特蘭數列

卡特蘭數列的公式為:

h(n) = h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)*h(0) ;n>=2;h[0]=1,h[1]=1;

h(n) = c(2n,n)-c(2n,n-1)

h(n) = c(2n,n)/(n+1)

*/int bivtable(int n)

}return vec[n];

}int main()

//輸出 132

關於卡特蘭數列更多的解釋參考部落格:

卡特蘭數列

由於最近怒刷筆試題遇到了很多關於卡特蘭數列的問題於是寫這篇文章,算是做個筆記吧。1卡特蘭數列的定義 是組合數學中乙個常出現在各種計數問題中出現的數列。由以比利時的數學家歐仁 查理 卡塔蘭 1814 1894 命名。2卡特蘭樹列的前幾項 1,2,5,14,42,132,429,1430,4862,16...

卡特蘭數列(Catalan)

卡特蘭數列是組合數學中乙個常出現在各種計數問題 現的數列,其前幾項為 1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,卡特蘭數首先是由尤拉在計算對凸 n 邊形的不同的對角三角形剖分的個數問題時得到的,即在乙個凸 n 邊形中,通過不相交於 n 邊形...

卡特蘭數列 Catalan

卡特蘭數列 catalan 簡述卡特蘭數又稱卡塔蘭數,它是組合數學中乙個常出現在各種計數問題 現的數列,其前幾項為 1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,公式1.遞迴公式1 2.遞迴公式2 3.組合公式1 4.組合公式2 5.增長趨勢 ...