卡特蘭數 hdu1130 hdu1133

2021-08-07 13:36:45 字數 1507 閱讀 4105

題意:給定一棵n個節點的二叉樹, 求這棵樹有多少個二叉樹。

資料範圍: n<=100

思路

n個節點的二叉樹有多種,多種二叉樹裡面又有子樹。當n到達100時,結果是乙個龐大的數字,所以要用到大數。

在卡特蘭數的應用裡面,求二叉樹的個數是乙個典型的應用,還有 合法的入棧出棧序列數、多邊形分成三角形的個數、圓括弧插入公式中的方法數  都是卡特蘭數的應用

卡特蘭數詳解: math173

(這個版面好看)

**

#include //最大到100,進行預處理

#include #include #define base 10000

#define maxn 100

using namespace std;

int num[105][100];

void multiply(int a,int b)

}void dive(int a,int b)

}int main()

while(scanf("%d",&n)!=eof)

printf("\n");

} return 0;

}

以上等價於求 n個入棧操作,n個出棧操作,典型的入棧運算元等於出棧運算元,但是還有不等於的情況,如下:

題意:電影院賣票。一張票50元。一開始沒有零錢。有m+n個人買票,m個人拿50元的鈔票,n個人拿100的。問隊伍有多少種排列方式可以使得賣票能順利進行下去。

資料範圍:m, n <=100 , m==n==0結束輸入

題解:很典型的卡特蘭數,詳情參見i_fuqiang的專欄  

**

#include #include using namespace std;

#define max 100

#define base 10000

void multiply(int a,int max,int b) //大數乘小數

}void divide(int a, int max, int b) //大數除小數

memcpy ( res , fact[m+n] , max * sizeof ( int ) ); //階乘 ( m + n )!

multiply ( res, max, m - n + 1 ); // ( m + n )! * ( m-n+1 )

divide ( res, max, m + 1 ); // ( m + n )! * ( m-n+1 ) / ( m+ 1 )

output ( res );

}return 0;

}

hdu4828卡特蘭數

題目大意 有2行n列的長方形格仔,把1到2n這些數放進格仔裡面,使每行每列都遞增。也就是相當於,n個0和n個1排序,要求每個點的前面都要求0的個數大於等於1的個數,問排列的順序的種數。可以轉換為卡特蘭數,有遞推式 cn 1 4n 2 n 2 cn 具體卡特蘭數的資料 要用到逆元 include in...

卡特蘭數(HDU 1023)

卡特蘭數又稱卡塔蘭數,是組合數學中乙個常出現在各種計數問題中出現的數列。由以比利時的數學家歐仁 查理 卡塔蘭 1814 1894 命名。卡特蘭數 前幾項為 oeis中的數列a000108 1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,74290...

HDU 1134,卡特蘭數

此題考查的是卡特蘭數,由於卡特蘭數很大,所以考慮大數處理。卡特蘭數的前幾項為 h 0 1 h 1 1 h 2 2 h 3 5 卡特蘭數的遞推公式為 h n h n 1 4 n 2 n 1 非遞推公式為c 2n,n n 1 此題用遞推公式求解,並用到大數的乘法和大數的乘法處理,本題對卡特蘭數的前100...