T3 / 卡特蘭數
學習一下卡特蘭數
卡特蘭數實際上就是一大類問題劃歸得到的一個結論
其通式:
Hn=n+1(n2n) (n≥2,n∈N∗)
遞推式:
Hn=⎩⎪⎪⎨⎪⎪⎧1i=0∑n−1HiHn−i−1n=0,1n≥2,n∈N+
下式還可寫作∑i=1nHi−1Hn−i,總之兩下標和爲n−1的兩數捲起來
數列前幾項:
Hn=1,1,2,5,14,42,⋯
兩式互相轉化不易證,咕
一些例子
非降路徑計數
求從原點走到在平面直角座標系上的y=x直線上的整點的方案數,且只能向上或向右走
打表發現數列符合1,1,2,5,⋯,於是卡特蘭
棧
入棧順序由1到n,求所有可能的出棧順序的總數
法一:打表觀察,發現數列符合1,1,2,5,⋯
法二:考慮n入棧的時機,前n−1個數出棧i,i∈[0,n−1]個後進入,那麼已出棧數列的方案數爲ai,加入n後數列的出棧方案數爲an−i−1,由於前n−1個數隨意組合,考慮乘法原理:
an=i=0∑n−1aian−i−1
故爲卡特蘭數列
二叉樹計數
求有n個節點的(無標號)二叉樹的種數
對於有n個節點的(無標號)二叉樹,考慮一個根節點,左兒子有i,i∈[0,n−1]個節點,右兒子則有n−i−1個節點,考慮乘法原理:
Sn=i=0∑n−1SiSn−i−1
故爲卡特蘭數列
T3 概率論
對於一棵隨機生成的n個結點的有根二叉樹(所有互相不同構的形態等概率出現),它的葉子節點數的期望是多少呢?
考慮樹個數,由上文知爲卡特蘭數列,樹個數記爲fi
記樹葉子節點數爲gi
考慮n個結點的二叉樹的得到:由n−1個結點的二叉樹加上一個葉子節點得來
不同的n−1二叉樹上加的葉子節點是不一樣的,如:
所以gi=nfi−1
於是期望:
E=figi=finfi−1=n+1(n2n)nn(n−12n−2)=2(2n−1)n(n+1)
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;
}