日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

组合数学 —— 卡特兰数列(Catalan)

發布時間:2025/3/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 组合数学 —— 卡特兰数列(Catalan) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【概述】

卡特蘭數列是組合數學中一個常出現在各種計數問題中出現的數列,其前幾項為 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, ......

卡特蘭數首先是由歐拉在計算對凸 n 邊形的不同的對角三角形剖分的個數問題時得到的,即在一個凸 n 邊形中,通過不相交于 n 邊形內部的對角線,把 n 邊形拆分成若干三角形,不同的拆分數目用 Hn 表示,Hn 即為卡特蘭數。

【公式】

1.遞歸公式 1

2.遞歸公式 2

3.組合公式 1

4.組合公式 2

【應用】

  • 二叉樹的計數:已知二叉樹有 n 個結點,求能構成多少種不同的二叉樹
  • 括號化問題:一個合法的表達式由()包圍,()可以嵌套和連接,如:(())()也是合法表達式,現給出?n 對括號,求可以組成的合法表達式的個數
  • 劃分問題:將一個凸 n+2 多邊形區域分成三角形區域的方法數
  • 出棧問題:一個棧的進棧序列為1,2,3,..n,求不同的出棧序列有多少種
  • 路徑問題:在 n*n 的方格地圖中,從一個角到另外一個角,求不跨越對角線的路徑數有多少種
  • 握手問題:2n 個人均勻坐在一個圓桌邊上,某個時刻所有人同時與另一個人握手,要求手之間不能交叉,求共有多少種握手方法
  • 【實現】

    1.n<=35 的卡特蘭數的實現

    LL h[36]; void init() {h[0]=h[1]=1;for(int i=2; i<=35; i++) {h[i]=0;for(int j=0; j<i; j++)h[i]=h[i]+h[j]*h[i-j-1];cout<<h[i]<<endl;} }

    2.n<100 的卡特蘭數的實現

    #define BASE 10000 int a[100+5][100]; void multiply(int num,int n,int b) {//大數乘法int temp=0;for(int i=n-1; i>=0; i--) {temp+=b*a[num][i];a[num][i]=temp%BASE;temp/=BASE;} } void divide(int num,int n,int b) {//大數除法int div=0;for(int i=0; i<n; i++) {div=div*BASE+a[num][i];a[num][i]=div/b;div%=b;} } void init(){memset(a,0,sizeof(a));a[1][100-1]=1;for(int i=2; i<=100; i++) {memcpy(a[i],a[i-1],sizeof(a[i-1]));multiply(i,100,4*i-2);divide(i,100,i+1);} } int main() {init();int n;while(scanf("%d",&n)!=EOF){int i;for(i=0;i<100 && a[n][i]==0;i++);printf("%d",a[n][i++]);for(;i<100;i++)printf("%04d",a[n][i]);printf("\n");}return 0; }

    ?【例題】

    • 小兔的棋盤(HDU-2067)(n<=35的卡特蘭數):點擊這里
    • Game of Connections(POJ-2084)(n<100的卡特蘭數):點擊這里
    • 小a的學期(2019牛客寒假算法基礎集訓營 Day1-H)(卡特蘭數列+組合數取模):點擊這里

    總結

    以上是生活随笔為你收集整理的组合数学 —— 卡特兰数列(Catalan)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。