[組合數學] T3 卡特蘭數

T3 / 卡特蘭數

學習一下卡特蘭數

卡特蘭數實際上就是一大類問題劃歸得到的一個結論
其通式:
Hn=(2nn)n+1 (n2,nN) H_n=\frac{\binom{2n}{n}}{n+1}\ (n\geq 2,n\in N^*)
遞推式:
Hn={1n=0,1i=0n1HiHni1n2,nN+ H_n=\left\{ \begin{aligned} &1&&n=0,1\\ &\sum_{i=0}^{n-1}H_{i}H_{n-i-1} &&n\geq 2,n\in N_+\\ \end{aligned} \right.
下式還可寫作i=1nHi1Hni\sum_{i=1}^nH_{i-1}H_{n-i},總之兩下標和爲n1n-1的兩數捲起來

數列前幾項:
Hn=1,1,2,5,14,42, H_n=1,1,2,5,14,42,\cdots

兩式互相轉化不易證,咕

一些例子

非降路徑計數

求從原點走到在平面直角座標系上的y=xy=x直線上的整點的方案數,且只能向上或向右走

打表發現數列符合1,1,2,5,1,1,2,5,\cdots,於是卡特蘭

入棧順序由1到n,求所有可能的出棧順序的總數

法一:打表觀察,發現數列符合1,1,2,5,1,1,2,5,\cdots
法二:考慮nn入棧的時機,前n1n-1個數出棧i,i[0,n1]i,i\in [0,n-1]個後進入,那麼已出棧數列的方案數爲aia_i,加入nn後數列的出棧方案數爲ani1a_{n-i-1},由於前n1n-1個數隨意組合,考慮乘法原理:
an=i=0n1aiani1 a_n=\sum_{i=0}^{n-1}a_{i}a_{n-i-1}
故爲卡特蘭數列

二叉樹計數

求有nn個節點的(無標號)二叉樹的種數

對於有nn個節點的(無標號)二叉樹,考慮一個根節點,左兒子有i,i[0,n1]i,i\in[0,n-1]個節點,右兒子則有ni1n-i-1個節點,考慮乘法原理:
Sn=i=0n1SiSni1 S_n=\sum_{i=0}^{n-1}S_iS_{n-i-1}
故爲卡特蘭數列

T3 概率論

對於一棵隨機生成的nn個結點的有根二叉樹(所有互相不同構的形態等概率出現),它的葉子節點數的期望是多少呢?

考慮樹個數,由上文知爲卡特蘭數列,樹個數記爲fif_i
記樹葉子節點數爲gig_i

考慮nn個結點的二叉樹的得到:由n1n-1個結點的二叉樹加上一個葉子節點得來
不同的n1n-1二叉樹上加的葉子節點是不一樣的,如:
在這裏插入圖片描述

所以gi=nfi1g_i=nf_{i-1}

於是期望:
E=gifi=nfi1fi=n(2n2n1)n(2nn)n+1=n(n+1)2(2n1) \begin{aligned} E&=\frac{g_i}{f_i}\\ &=\frac{nf_{i-1}}{f_i}\\ &=\frac{n\frac{\binom{2n-2}{n-1}}{n}}{\frac{\binom{2n}{n}}{n+1}}\\ &=\frac{n(n+1)}{2(2n-1)} \end{aligned}

Prod概率論

#include<bits/stdc++.h>
using namespace std;

int main(){
	double n;
	scanf("%lf",&n);
	n=n*(n+1)/(2*(2*n-1));
	printf("%.9lf",n);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章