今天看到阿里有道筆試題,涉及到catalan數(貌似是13年的),而後總結一下catalan數。 設計
catalan數描述:設c(1)=1,catalan數知足遞歸式c(n)=c(1)c(n-1)+c(2)c(n-2)...c(n-1)c(1).通用公式爲c(n)=C(n,2n)/(n+1)
遞歸
其實問題能夠轉述爲:假設有n個數順序入棧,則可能出棧的方式有多少種?好比有3個數1 2 3,出棧的方式爲1 2 三、2 1 三、1 3 二、3 2 一、2 3 1共有5種。思考:入棧的操做有n步,出棧的操做也有n步,若是咱們用1表示入棧,0表示出棧,這至關於對2n個數進行全排列,其限制條件爲:從左到有掃描這2n個數,1的累積次數必須不得少於0的次數。 二進制
證實以下:首先不考慮限制條件,就至關於對2n個數進行全排列,根據排列組合知識,很容易獲得總共的排列方法有C(2n,n)的方式,接下來剔除符合限制條件的方式便可。咱們能夠這樣考慮,假設在第2m+1位置上(含),0的個數爲m+1,1的個數爲m,這從2m+2到2n的位置中總共有n-m-1個0,n-m個1,若是咱們2m+2到2n的位置上全部的0,1進行反轉,即0->1,1->0,則其後0的個數變爲n-m,1的個數變爲n-m-1,那麼這個2n數中1的個數總共爲n-1,0的個數爲n+1。也就是說,對於總共2n個數,若是有n+1個0,n-1個1,則在某個奇數位置必存在0的累積個數大於1的累積個數。即n+1個0和n-1個1必對應一個不符合要求的數。 用上述方法創建由n-1個1和n+1個0組成的2n個數,與由n個1和n個0組成的2n個數進行一一對應。例如:10100101由4個1和4個0組成的8位二進制數,但在第5個位置0的累積個數爲3,1的累積個數爲0,則對應3個1和2個0組成的10100010,所以不符合要求的2n個數與n-1個1和n+1個0組成的2n個數一一對應,故結果爲C(2n,n)-c(2n,n+1) 方法
catalan數的應用挺普遍的,主要應用於如下幾類問題: 總結
(1)括號化問題
矩陣鏈乘: P=a1*a2*a3*……*an,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案
(2)出棧次序問題
有2n我的排成一行進入劇場。入場費5元。其中只有n我的有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視做將5元入棧,持10元者到達視做使棧中某5元出棧)
(3)將多邊行劃分爲三角形問題
在圓上選擇2n個點,將這些點成對鏈接起來使得所獲得的n條線段不相交的方法數?
(4)單調路徑問題
一個單調路徑從格點左下角出發,在格點右上角結束,每一步均爲向上或向右,不能越過對角線
筆試
不過咱們彷佛沒有用到catalan數的遞歸,好比若是須要咱們輸出出棧的順序,則怎麼設計?先mark一下,晚上我再糾結。。。 思考