咱們以一道題爲例來介紹卡特蘭數:spa
題目連接:知足條件的01序列
3d
給定n個0和n個1,它們將按照某種順序排成長度爲2n的序列,求它們能排列成的全部序列中,可以知足任意前綴序列中0的個數都很多於1的個數的序列有多少個。blog
輸出的答案對109+7取模。字符串
爲了便於解決,咱們能夠把這個問題轉化成:get
給定一個n*n的矩陣,每一步只能往右走或者往上走,求從左下角頂點走到右上角頂點全部方案中,往右走的步數很多於往上走的步數的方案的數量,而且對109+7取模。數學
咱們再將目標進行一步轉化:it
合法路徑數 = 總路徑數 - 非法路徑數class
其中總路徑數顯然爲組合數C126,故接下去只需求非法路徑數便可。原理
咱們舉n=6的實例來看:百度
以下圖:
從(0,0)走到(6,6)的路徑全部路徑就是總路徑。
顯然,全部黑線如下的路徑皆爲合法路徑,如圖中綠線所示路徑就是一條合法路徑。
而任何一條通過紅線的路徑必定是非法路徑,如圖中藍線所示路徑。
那麼咱們將該非法路徑第一次通過紅線後的部分關於紅線做對稱,如圖中黃線所示。
不難發現,任何一條非法路徑進行如上的對稱操做後終點必定是(5,7)。
進而又能夠發現,從(0,0)到(5,7)的任何一條路徑進行如上對稱操做後必定是一條非法路徑。
故從(0,0)到(5,7)的路徑與非法路徑構成雙射。
那麼顯然,非法路徑數便是組合數C125。
因此合法路徑數就是C126 - C125。
而咱們又能夠發現,C2nn - C2nn-1 = C2nn/(n+1)。
這就是卡特蘭數。
而上述該題正是卡特蘭數的一個應用。
卡特蘭數:
如下內容參考百度百科:卡特蘭數
卡特蘭數又稱卡塔蘭數,卡特蘭數是組合數學中一個常出如今各類計數問題中的數列。以比利時的數學家歐仁·查理·卡塔蘭 (1814–1894)的名字來命名。
原理:
設h(n)爲catalan數的第n項,令h(0)=1,h(1)=1,catalan數知足遞推式:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)
例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
另類遞推式:
h(n)=h(n-1)*(4*n-2)/(n+1);
遞推關係的解爲:
h(n)=C(2n,n)/(n+1) (n=0,1,2,...)
遞推關係的另類解爲:
h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)
卡特蘭數的常見應用:
1、出棧次序
一個棧(無窮大)的進棧序列爲1,2,3,…,n,有多少個不一樣的出棧序列?
2、括號化
矩陣連乘: P=a1×a2×a3×……×an,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案?(h(n)種)
3、凸多邊形三角劃分
在一個凸多邊形中,經過若干條互不相交的對角線,把這個多邊形劃分紅了若干個三角形。任務是鍵盤上輸入凸多邊形的邊數n,求不一樣劃分的方案數f(n)。好比當n=6時,f(6)=14。
給定N個節點,能構成多少種不一樣的二叉搜索樹?(能構成h(n)個)
給定n對括號,求括號正確配對的字符串數。