catalan數在筆試題中的應用

2021-06-19 04:27:10 字數 3928 閱讀 8894

令h(0)=1,h(1)=1,catalan數滿足遞推式

[1]:

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

另類遞推式

[2]:

h(n)=h(n-1)*(4*n-2)/(n+1);

遞推關係的解為:

h(n)=c(n,2n)/(n+1) (n=0,1,2,...)

遞推關係的另類解為:

h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,...)

招聘筆試題

在圖書館一共6個人在排隊,3個還《面試寶典》一書,3個在借《面試寶典》一書,圖書館此時沒有了面試寶典了,求他們排隊的總數?

解析:此題就是catalan數的乙個典型應用,根據公式 f(n) = c(2n^n)/(n+1)。c(6^3)/4 = 5.由於人是區別的,所以還有排列組合一下3!*3!=36.

所以他們排隊的總數為: 5*36 = 180.

下面是阿里巴巴的一道筆試題

16個人按順序去買燒餅,其中8個人每人身上只有一張5塊錢,另外8個人每人身上只有一張10塊錢。燒餅5塊乙個,開始時燒餅店老闆身上沒有錢。16個顧客互相不通氣,每人只買乙個。問這16個人共有多少種排列方法能避免找不開錢的情況出現?

解析:同樣是卡特蘭數的應用。 總數為:c(16^8)/9 * 8!*8! = 1430*8!*8!

下面拓展一下catalan數的應用

卡特蘭數,是組合數學中乙個常出現在各種計數問題中出現的數列。輸入乙個整數n,計算h(n)。其遞迴式如下:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2,h(0) = h(1) = 1) 該遞推關係的解為:h(n)=c(2n,n)/(n+1) (n=1,2,3,...)

直接根據遞迴式,可以很快的寫出相應的**。

卡特蘭數前幾項為 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...

應用1:乙個棧(無窮大)的進棧序列為1,2,3,…,n,有多少個不同的出棧序列?

分析:對於每乙個數來說,必須進棧一次、出棧一次。我們把進棧設為狀態『1』,出棧設為狀態『0』。n個數的所有狀態對應n個1和n個0組成的2n位二進位制數。由於等待入棧的運算元按照1‥n的順序排列、入棧的運算元b大於等於出棧的運算元a(a≤b),因此輸出序列的總數目=由左而右掃瞄由n個1和n個0組成的2n位二進位制數,1的累計數不小於0的累計數的方案種數。

在2n位二進位制數中填入n個1的方案數為c(2n,n),不填1的其餘n位自動填0。從中減去不符合要求(由左而右掃瞄,0的累計數大於1的累計數)的方案數即為所求。

不符合要求的數的特徵是由左而右掃瞄時,必然在某一奇數字2m+1位上首先出現m+1個0的累計數和m個1的累計數,此後的2(n-m)-1位上有n-m個 1和n-m-1個0。如若把後面這2(n-m)-1位上的0和1互換,使之成為n-m個0和n-m-1個1,結果得1個由n+1個0和n-1個1組成的2n位數,即乙個不合要求的數對應於乙個由n+1個0和n-1個1組成的排列。

反過來,任何乙個由n+1個0和n-1個1組成的2n位二進位制數,由於0的個數多2個,2n為偶數,故必在某乙個奇數字上出現0的累計數超過1的累計數。同樣在後面部分0和1互換,使之成為由n個0和n個1組成的2n位數,即n+1個0和n-1個1組成的2n位數必對應乙個不符合要求的數。

因而不合要求的2n位數與n+1個0,n-1個1組成的排列一一對應。顯然,不符合要求的方案數為c(2n,n+1)。

由此得出輸出序列的總數目=c(2n,n)-c(2n,n+1)=c(2n,n)/(n+1)=h(n+1)。

應用2:括號匹配

分析:n對括號相當於有2n個符號,n個左括號、n個右括號,可以設問題的解為f(2n)。第0個符號肯定為左括號,與之匹配的右括號必須為第2i+1字元。因為如果是第2i個字元,那麼第0個字元與第2i個字元間包含奇數個字元,而奇數個字元是無法構成匹配的。

通過簡單分析,f(2n)可以轉化如下的遞推式 f(2n) = f(0)*f(2n-2) + f(2)*f(2n - 4) + ... + f(2n - 4)*f(2) + f(2n-2)*f(0)。簡單解釋一下,f(0) * f(2n-2)表示第0個字元與第1個字元匹配,同時剩餘字元分成兩個部分,一部分為0個字元,另一部分為2n-2個字元,然後對這兩部分求解。f(2)*f(2n-4)表示第0個字元與第3個字元匹配,同時剩餘字元分成兩個部分,一部分為2個字元,另一部分為2n-4個字元。依次類推。

假設f(0) = 1,計算一下開始幾項,f(2) = 1, f(4) = 2, f(6) = 5。結合遞迴式,不難發現f(2n) 等於h(n)。

應用3:矩陣鏈乘: p=a1×a2×a3×……×an,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案?

分析:可以這樣考慮,首先通過括號化,將p分成兩個部分,然後分別對兩個部分進行括號化。比如分成(a1)×(a2×a3.....×an),然後再對(a1)和(a2×a3.....×an)分別括號化;又如分成(a1×a2)×(a3.....×an),然後再對(a1×a2)和(a3.....×an)括號化。

設n個矩陣的括號化方案的種數為f(n),那麼問題的解為

f(n) = f(1)*f(n-1) + f(2)*f(n-2) + f(3)*f(n-3) + f(n-1)*f(1)。f(1)*f(n-1)表示分成(a1)×(a2×a3.....×an)兩部分,然後分別括號化。計算開始幾項,f(1) = 1, f(2) = 1, f(3) = 2, f(4) = 5。結合遞迴式,不難發現f(n)等於h(n-1)。

應用4:n個節點構成的二叉樹,共有多少種情形?

分析:可以這樣考慮,根肯定會占用乙個結點,那麼剩餘的n-1個結點可以有如下的分配方式,t(0, n-1),t(1, n-2),...t(n-1, 0),設t(i, j)表示根的左子樹含i個結點,右子樹含j個結點。

設問題的解為f(n),那麼f(n) = f(0)*f(n-1) + f(1)*f(n-2) + .......+ f(n-2)*f(1) + f(n-1)*f(0)。假設f(0) = 1,那麼f(1) = 1, f(2) = 2, f(3) = 5。結合遞推式,不難發現f(n)等於h(n)。

應用5:在圓上選擇2n個點,將這些點成對連線起來使得所得到的n條線段不相交的方法數?

分析:以其中乙個點為基點,編號為0,然後按順時針方向將其他點依次編號。那麼與編號為0相連點的編號一定是奇數,否則,這兩個編號間含有奇數個點,勢必會有個點被孤立,即在一條線段的兩側分別有乙個孤立點,從而導致兩線段相交。設選中的基點為a,與它連線的點為b,那麼a和b將所有點分成兩個部分,一部分位於a、b的左邊,另一部分位於a、b的右邊。然後分別對這兩部分求解即可。

設問題的解f(n),那麼f(n) = f(0)*f(n-2) + f(2)*f(n-4) + f(4)*f(n-6) + ......f(n-4)*f(2) + f(n-2)*f(0)。f(0)*f(n-2)表示編號0的點與編號1的點相連,此時位於它們右邊的點的個數為0,而位於它們左邊的點為2n-2。依次類推。f(0) = 1, f(2) = 1, f(4) = 2。結合遞迴式,不難發現f(2n) 等於h(n)。

其他應用:

(1)n*n的方格地圖中,從乙個角到另外乙個角,不跨越對角線的路徑數.

(2)n條邊的多邊形,能被分割成三角形的方案數.

(3)圓桌周圍有 2n個人,他們兩兩握手,但沒有交叉的方案數

筆試題中的必勝策略

比如,題目是這樣的 現在有兩堆石子,小今與小條玩遊戲,2個人都足夠聰明,兩個人規定 每次每人只能從其中一堆中取走1個或2個或3個石子,最後將石子全部取完的人勝利.現在兩堆石子的個數為8和9,請問如何安排才能讓小今必勝?答案是 讓小今先取。其實這裡是有規律可循的,可歸結為 取餘制勝 詳解如下 一 取餘...

C語言筆試題中的「坑」

其實這話說的不對,應該說不只是c語言,恐怕是面試題總會有那麼一些坑等著我們踩,今天,就羅列了一些看似簡單,卻很容易中招的面試題 1 以下程式的執行結果為。inlcude define n 2 define m n 1 define num m 1 m 2 main a 5b 6c 8d 9 嘿嘿,當...

JS筆試題中的型別轉換

分享一道筆試題 let x valueof console.log x 20 console.log x 30 複製 答案是false true 為什麼?讓我們回到紅寶書中,對於相等描述符是這樣表述的 是相等操作符,如果兩個運算元相等,則返回true,而不相等操作符由嘆號後更等於號 表示,如果兩個運...