Catalan Number 卡特蘭數

2021-06-20 15:48:22 字數 2843 閱讀 9455

其前幾項為 :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, ...

令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(2n,n)/(n+1) (n=0,1,2,...)

遞推關係的另類解為:

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

推導:對於每乙個數來說,必須進棧一次、出棧一次。我們把

進棧設為狀態『1』,出棧設為狀態『0』。n個數的所有狀態對應n個1和n個0組成的2n位

二進位制數

。由於等待入棧的運算元按照1‥n的順序排列、入棧的運算元b大於等於

出棧的運算元a(a≤b),因此輸出序列的總數目=由左而右掃瞄由n個1和n個0組成的2n位

二進位制數

,1的累計數不小於0的累計數的方案種數。顯然,不符合要求的方案數為c(2n,n+1)。由此得出輸出序列的總數目=c(2n,n)-c(2n,n+1)=c(2n,n)/(n+1)=h(n+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位數必對應乙個不符合要求的數。

實際題目中,對初始值的理解是關鍵

應用:出棧次序,3個元素,f(3)=h(3)=5,f(n)=h(n)

應用:凸三角形劃分:在乙個凸多邊形中,通過若干條互不相交的對角線,把這個多邊形劃分成了若干個三角形。任務是鍵盤上輸入凸多邊形的邊數n,求不同劃分的方案數f(n)。比如當n=6時,f(6)=h(4)=14,f(n)=h(n-2).

因為凸多邊形的任意一條邊必定屬於某乙個三角形,所以我們以某一條邊為基準,以這條邊的兩個頂點為起點p1和終點pn(p即point),將該凸多邊形的頂點依序標記為p1、p2、……、pn,再在該凸多邊形中找任意乙個不屬於這兩個點的頂點pk(2<=k<=n-1),來構成乙個三角形,用這個三角形把乙個凸多邊形劃分成兩個凸多邊形,其中乙個凸多邊形,是由p1,p2,……,pk構成的凸k邊形(頂點數即是邊數),另乙個凸多邊形,是由pk,pk+1,……,pn構成的凸n-k+1邊形。

應用:買票找零f(n) = h(n)

有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視作將5元入棧,持10元者到達視作使棧中某5元出

棧) 小兔的棋盤f(n) = h(n)

小兔的叔叔從外面旅遊回來給她帶來了乙個禮物,小兔高興地跑回自己的房間,拆開一看是乙個棋盤,小兔有所失望。不過沒過幾天發現了棋盤的好玩之處。從起點(0,0)走到終點(n,n)的最短路徑數是c(2n,n),現在小兔又想如果不穿越對角線(但可接觸對角線上的格點),這樣的路徑數有多少?小兔想了很長時間都沒想出來,現在想請你幫助小兔解決這個問題,對於你來說應該不難吧!

最後上乙個求catalan數的codes

from functools import lru_cache

class solution:

def catalan(self, n):

@lru_cache(none)

def c(n,m):

if (m == n):

return 1

elif (m == 1):

return n

return c(n-1,m-1)+c(n-1,m)

return c(2*n,n)-c(2*n,n-1)

@lru_cache(none)

def catalan2(self,n):

if (n == 0 or n == 1):

return 1

res = 0

for i in range(0,n):

res += self.catalan2(i)*self.catalan2(n-i-1)

return res

s = solution()

print(s.catalan2(3))

Catalan Number 卡特蘭數

卡特蘭數是乙個比較有意思的數列,有幾個經典問題的模型如下 1.n對括號的合法表示式有多少種可能,其中答案為c n 表示卡特蘭數列的第n項 2.有n個節點的二叉樹的所有可能形態有多少種,也是c n 3.計算有n 1個葉節點的滿二叉樹有多少種,也是c n 4.序列的所有排列中不出現 123 或者任何乙個...

卡特蘭數(catalan number)

卡塔蘭數是組合數學中乙個常在各種計數問題中出現的數列。公式為 前幾項為 n 0,1,2,3,4,5時 1,1,2,5,14,42 2.1 乙個棧的進棧次序為1 2 3 n。有多少種不同的出棧次序?當 2.2 有n個結點,總共能構成幾種不同的二叉樹?當 2.3 其它常見問題 1.n對括號有多少種匹配方...

卡特蘭數 Catalan number

卡特蘭數的一種常用計算公式 c 2n,n c 2n,n 1 從 0,0 出發到 n,n 每次只能向右或向上,不可以越過藍線,即不能走到紅線上。如果不受紅線限制從 0,0 出發到 n,n 的所有方案有c 2n,n 中,可以理解為在2n次移動中選擇n次做向右或向上運動。那麼拿全集減去走到紅線上的方案就是...