卡特蘭數的性質及其應用擴充套件
問題描述:卡塔蘭數,是組合數學中一個常出現在各種計數問題中出現的數列。輸入一個整數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,...)
思路:直接根據遞迴式,寫出相應的演算法。
參考程式碼
//函式功能: 計算Catalan的第n項
//函式引數: n為項數
//返回值: 第n個Catalan數
int Catalan(int n)
{
if(n <= 1)
return 1;
int *h = new int [n+1]; //儲存臨時結果
h[0] = h[1] = 1; //h(0)和h(1)
for(int i = 2; i <= n; i++) //依次計算h(2),h(3)...h(n)
{
h[i] = 0;
for(int j = 0; j < i; j++) //根據遞迴式計算 h(i)= h(0)*h(i-1)+h(1)*h(i-2) + ... + h(i-1)h(0)
h[i] += (h[j] * h[i-1-j]);
}
int result = h[n]; //儲存結果
delete [] h; //注意釋放空間
return result;
}
應用1描述:n對括號有多少種匹配方式?
思路: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)。
應用2描述:矩陣鏈乘: 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)。
應用3描述:一個棧(無窮大)的進棧序列為1,2,3,…,n,有多少個不同的出棧序列?
思路:這個與加括號的很相似,進棧操作相當於是左括號,而出棧操作相當於右括號。n個數的進棧次序和出棧次序構成了一個含2n個數字的序列。第0個數字肯定是進棧的數,這個數相應的出棧的數一定是第2i+1個數。因為如果是2i,那麼中間包含了奇數個數,這奇數個肯定無法構成進棧出棧序列。
設問題的解為f(2n), 那麼f(2n) = f(0)*f(2n-2) + f(2)*f(2n-4) + f(2n-2)*f(0)。f(0) * f(2n-2)表示第0個數字進棧後立即出棧,此時這個數字的進棧與出棧間包含的數字個數為0,剩餘為2n-2個數。f(2)*f(2n-4)表示第0個數字進棧與出棧間包含了2個數字,相當於1 2 2 1,剩餘為2n-4個數字。依次類推。
假設f(0) = 1,計算一下開始幾項,f(2) = 1, f(4) = 2, f(6) = 5。結合遞迴式,不難發現f(2n) 等於h(n)。
應用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)。
應用6描述:求一個凸多邊形區域劃分成三角形區域的方法數?
思路:以凸多邊形的一邊為基,設這條邊的2個頂點為A和B。從剩餘頂點中選1個,可以將凸多邊形分成三個部分,中間是一個三角形,左右兩邊分別是兩個凸多邊形,然後求解左右兩個凸多邊形。
設問題的解f(n),其中n表示頂點數,那麼f(n) = f(2)*f(n-1) + f(3)*f(n-2) + ......f(n-2)*f(3) + f(n-1)*f(2)。f(2)*f(n-1)表示三個相鄰的頂點構成一個三角形,那麼另外兩個部分的頂點數分別為2和n-1。
設f(2) = 1,那麼f(3) = 1, f(4) = 2, f(5) = 5。結合遞推式,不難發現f(n) 等於h(n-2)。
應用7描述:有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?
思路:可以將持5元買票視為進棧,那麼持10元買票視為5元的出棧。這個問題就轉化成了棧的出棧次序數。由應用三的分析直接得到結果,f(2n) 等於h(n)。
相關推薦
卡特蘭數(Catalan)及其應用
入棧 一個 其中 無法 數列 選擇 每天 編號 匹配 卡特蘭數 大佬博客https://blog.csdn.net/doc_sgl/article/details/8880468 卡特蘭數是組合數學中一個常出現在各種計數問題中出現的數列。 卡特蘭數前幾項為 : C0=
卡特蘭數 性質及應用
卡塔蘭數是組合數學中一個常在各種計數問題中出現的數列。以比利時的數學家歐仁·查理·卡塔蘭(1814–1894)命名。歷史上,清代數學家明安圖(1692年-1763年)在其《割圜密率捷法》最早用到“卡塔蘭數”,遠遠早於卡塔蘭[1][2][3]。有中國學者建議將此數命名為“明安
卡特蘭數的性質及其應用擴充套件
問題描述:卡塔蘭數,是組合數學中一個常出現在各種計數問題中出現的數列。輸入一個整數n,計算h(n)。其遞迴式如下:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(
一道面試題到卡特蘭數及其應用
繪畫展覽門票每張5元,如果有2n個人排隊購票,每人一張,並且其中一半人恰有5元錢,另一半人恰有10元錢,而票房無零錢可找,那麼如何將這2n個人排成一列,順次購票,使得不至於因票房無零錢可找而耽誤時間,應該採用什麼演算法解決呢?(分支限界法) 這個是卡特
卡特蘭數及其應用
一道棧的題目 最近做一道有關棧的題目,題目是這樣的: 若一序列進棧順序為e1,e2,e3,e4,e5,問存在多少種可能的出棧序列? 這道題用遞推可以算出來,假設第k個數進棧,設f(k)表示k個數的總出棧序列數,則它前面的k-1個數有f(k-1)種出棧
卡特蘭數及其使用典型例子
卡特蘭數是一個常用在計數情況中使用的一種特殊的數列,其原理如下:一、原理若令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
卡特蘭數在多種問題下的應用 組合數學-Catalan數
4)排隊順序問題1】長度為2n的Dyck words有多少種?(Dyck words是由n個X和n個Y組成的字串,其有一個特點:從左往右,對X和Y分別計數,Y的個數始終不大於X的個數。)轉化思路:可以把X看作入棧,Y看作出棧,Y的個數始終不大於X的個數這一性質正好和空棧無法再出棧相一致,所以Dyck word
卡特蘭數catalan證明及應用舉例
卡塔蘭數是組合數學中一個常在各種計數問題中出現的數列。其計算公式是 Cn=Cn2nn+1=(2n)!(n+1)!n!,n為自然數 C n
卡特蘭數,程式實現,遞迴,迴圈,BST和出入棧順序的應用
卡特蘭數是組合數學中的一種數列,它的來歷和重要性可以自行百度,我主要說它的特徵和程式設計實現。 前幾項是1, 1, 2, 5, 14, 42, 132……, 如果令h(0)=h(1)=1,那麼h(n)=h(0)*h(n-1)+h(1)*h(n-2) + .
卡特蘭數應用--n個元素的出棧順序與從(0,0)到(n,n)不穿過對角線的方法數
1.出棧順序方法數: hdoj1023 求出棧序列,比如1,2,3,出棧序列為3 2 1,1 2 3,1 3 2,2 1 3,2 3 1,一共5種 第一種思路: 我們把入棧看做1,出棧看做0,那麼入棧
卡特蘭數(catalan數)總結 (卡特蘭大數、卡特蘭大數取模、卡特蘭數應用)
本文講解卡特蘭數的各種遞推公式,以及卡特蘭數、卡特蘭大數、卡特蘭大數取模的程式碼實現,最後再順帶提一下卡特蘭數的幾個應用。 什麼是卡特蘭數呢?卡特蘭數無非是一組有著某種規律的序列。重要的是它的應用。
卡特蘭數的應用(易懂版)
不符合要求的數的特徵是由左而右掃描時,必然在某一奇數位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位數,即一個不
(轉載)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(