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數滿足遞推式。h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)。也就是說,如果能把公式化成上面這種形式的數,就是卡特蘭數

 當然,上面這樣的遞推公式太繁瑣了,於是數學家們又求出了可以快速計算的通項公式。h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,...)。這個公式還可以更簡單得化為h(n)=C(2n,n)/(n+1)。後一個公式都可以通過前一個公式經過幾步簡單的演算得來,大家可以拿起筆試試,一兩分鐘就可以搞定。       三、卡特蘭數的應用
卡特蘭數經常出現在OI以及ACM中,在生活中也有廣泛的應用。下面舉幾個例子。       1、出棧次序:一個棧(無窮大)的進棧次序為1、2、3……n。不同的出棧次序有幾種。             我們可以這樣想,假設k是最後一個出棧的數。比k早進棧且早出棧的有k-1個數,一共有h(k-1)種方案。比k晚進棧且早出棧的有n-k個數,一共有h(n-k)種方案。所以一共有h(k-1)*h(n-k)種方案。顯而易見,k取不同值時,產生的出棧序列是相互獨立的,所以結果可以累加。k的取值範圍為1至n,所以結果就為h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0)。             出棧入棧問題有許多的變種,比如n個人拿5元、n個人拿10元買物品,物品5元,老闆沒零錢。問有幾種排隊方式。熟悉棧的同學很容易就能把這個問題轉換為棧。值得注意的是,由於每個拿5元的人排隊的次序不是固定的,所以最後求得的答案要*n!。拿10元的人同理,所以還要*n!。所以這種變種的最後答案為h(n)*n!*n!。      2、二叉樹構成問題
。有n個結點,問總共能構成幾種不同的二叉樹。             我們可以假設,如果採用中序遍歷的話,根結點第k個被訪問到,則根結點的左子樹有k-1個點、根結點的右指數有n-k個點。k的取值範圍為1到n。講到這裡就很明顯看得出是卡特蘭數了。這道題出現在2015年騰訊實習生的線上筆試題中。有參加過的同學想必都有印象。      3、凸多邊形的三角形劃分。一個凸的n邊形,用直線連線他的兩個頂點使之分成多個三角形,每條直線不能相交,問一共有多少種劃分方案。              這也是非常經典的一道題。我們可以這樣來看,選擇一個基邊,顯然這是多邊形劃分完之後某個三角形的一條邊。圖中我們假設基邊是p1pn,我們就可以用p1、pn和另外一個點假設為pi做一個三角形,並將多邊形分成三部分,除了中間的三角形之外,一邊是i邊形,另一邊是n-i+1邊形。i的取值範圍是2到n-1。所以本題的解c(n)=c(2)*c(n-1)+c(3)*c(n-2)+...c(n-1)*c(2)。令t(i)=c(i+2)。則t(i)=t(0)*t(i-1)+t(1)*t(i-2)...+t(i-1)*t(0)。很明顯,這就是一個卡特蘭數了。                      4、其他。諸如括號匹配問題、01序列問題、n邊形格子從左下角走到右上角不跨過對角線問題。這些都是卡特蘭數,其他問題也基本上是上面問題的變種。證明過程就不再贅述了。         四、卡特蘭數通項公式的證明。

相關推薦

初步學習

       前幾天做騰訊的線上筆試題遇到一道卡特蘭數的題目,想了好久才想起來怎麼做。再仔細想想自己好像從來沒有系統地學習過卡特蘭數,於是就專門去研究了一下。        一、關於卡特蘭數        卡特蘭數是一種經典的組合數,經常出現在各種計算中,其前幾項為 : 1, 2, 5, 14, 42,

學習筆記第十八節:

前話       本樓主是蒟蒻,居然最近才搞懂了卡特蘭數,在這裡總結一下,最基礎的總結。 正題       定義卡特蘭數為:       卡特蘭數的遞推式是:    

演算法學習——

聯賽前複習一點東西吧。。。 計算公式:   \[h_{n} = h_{0} \cdot h_{n - 1} + h_{1} \cdot h_{h - 2} + ... + h_{n - 1} \cdot h_{0}\]   \[h_{n} = h_{n - 1} \cdot (4n - 2) / (n +

筆試題學習(dp,重疊子問題,,手電過橋,最長公共子序列)

卡特蘭數:https://blog.csdn.net/doc_sgl/article/details/8880468 dp,重疊子問題:https://www.cnblogs.com/hapjin/p/5572483.html 美團2016校招筆試題:https://zhuanlan.zhihu.com/p/

(轉載)Catalan——

出現 註意 城市 ads 大於 編號 只有一個 導致 一個點 Catalan數——卡特蘭數 今天阿裏淘寶筆試中碰到兩道組合數學題,感覺非常親切,但是筆試中失蹤推導不出來後來查了下,原來是Catalan數。悲劇啊,現在整理一下一、Catalan數的定義令h(1)=1,Cata

ini bits clas cnblogs 操作 div esp class 序列 卡特蘭數是組合數學 常見的數列 主要有4中形式: 1: h(n)= C 2n n /(n+1) 2: h(n)= C 2n n - C 2n n-1 3: h(n)= h(n

HDU 1133 Buy the Ticket

i++ ava () pos str mat bre == ann 設50元的人為+1 100元的人為-1 滿足前隨意k個人的和大於等於0 卡特蘭數 C(n+m, m)-C(n+m, m+1)*n!*m! import java.math.*; import java

HDU 1134 Game of Connections(

cut res ras sam eof cpp ont des tel 題目代號:HDU 1134 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1134 Game of Connections Time Limit: 200

bzoj2822[AHOI2012]樹屋階梯()

n+1 amp nbsp put mat pan cat limit 一個 2822: [AHOI2012]樹屋階梯 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 879 Solved: 513[Submit][Sta

【BZOJ 2822】[AHOI2012]樹屋階梯 +高精

div cnblogs operator line code clu while pan .... 這道題隨便弄幾個數就發現是卡特蘭數然而為什麽是呢? 我們發現我們在增加一列時,如果這一個東西(那一列)他就一格,那麽就是上一次的方案數,並沒有任何改變,他占滿了也是,然後他

【專題】計數問題(排列組合,容斥原理,

spl 狀態 ans 補集 方便 常用 括號 inf 不存在 ---下面都是學習的筆記,還沒有整理,比較淩亂,有需自取吧。--- 【排列組合】 <加法原理>做一件事情有n個方法,第i個方法有pi種方案,則一共有p1+p2+...+pn種方案。 <乘法原理&

相關問題

計數問題 steps str 多少 gin svg tex day src 一、什麽是Catalan數 說到Catalan數,就不得不提及Catalan序列,Catalan序列是一個整數序列,其通項公式是 遞推公式是 C(n) = C(1)*C(n-1) + C(

【算法專題】(計數數列)

n-1 映射 點分治 blog -s 方法 .org div n-k Catalan數列:1 1 1 2 5 14 42 132 429 1430 4862 16796 【計數映射思想】 參考:卡特蘭數 — 計數的映射方法的偉大勝利 計數映射:將難以統計的數映射為另一種形式

淺談求的幾種方法

ade ++i return can 輸出 很好 include using 範圍   卡特蘭數是一個很常見的數列,以比利時的數學家歐仁·查理·卡塔蘭 (1814–1894)的名字來命名,其前幾項為 : 1, 1, 2, 5, 14,

N個節點的二叉樹有多少種形態(

面試 誤區 樹的定義 節點 類型 基礎 更多 大於等於 證明 這是一道阿裏的面試題。其實算不上新鮮,但是我之前沒關註過,如今碰到了,就順便探討下這個問題吧:) 拿到這個題,首先想到的是直接寫出表達式肯定不行,所以有必要從遞推入手。由特殊到一般,歸納法麽~而且二叉樹離不開遞推

小結

bbc dstat ati 分享 分享圖片 ali 加油 lin fighting 卡特蘭數 卡特蘭數通項公式: h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2) h(n)=h(n-1

[NOIP模擬賽7.9]fseq:

stdout pen clas 1.0 卡特蘭 c代碼 open -- 就是 卡特蘭數裸題,太裸了。 (可我就是錯了QwQ,忘了特判n<m的情況) AC代碼: #include <cstdio> #include <cstdlib> int n

POJ2084 Game of Connections 關於經典的幾個問題

可能 2個 nbsp 二叉樹 air sta memory poj 線段 Game of Connections Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 9128 Accept

【轉】

證明 water 交叉 鏈接 計算公式 通過 順序 節點 應用 原文鏈接:https://blog.csdn.net/wu_tongtong/article/details/78161211 推導:https://www.cnblogs.com/jiayouwyhit/p/

Catalan

bsp 凸包 net 規律 序列 targe 不同 target 二叉 推薦:卡特蘭數總結 定義 公式 模型與例題 1.火車進棧 luogu棧 2.合法括號序列 牛客9.16普及組T4 3.0/1走 4.凸包三角形劃分。 5.n個點二叉樹不同形態方案數。