卡塔蘭數的應用
卡塔蘭數定義
f(n) = f(0)f(n-1) + f(1)f(n-2) + ... + f(n-1)f(0)
= f(k-1)f(n-k) k=1...n
以k為軸劃分子問題,左邊子問題的解的個數和右邊子問題的解的個數是原問題以k為軸的解法的2個獨立步驟,適用乘法原理
分別以1,2,。。。n為軸,是原問題的n種解法,適用加法原理。
int cantalan(int n) { vector<int> f(n + 1); f[0] = 1; for (int i = 1; i <= n; i++) for (int k = 1; k <= i; k++) //iterate the case k(1..i) as the root f[i] += f[k - 1] * f[i - k]; return f[n]; }
應用:
1)給定n個括號,求所有合法括號組合數。
劃分辦法:第一個左括號分別和第k個(k=1...n)右括號結合,這樣k左邊有k-1個右括號(也必然有k-1個左括號,因為我們在討論合法組合),解個數f(k-1), k右邊n-k個右括號,解個數f(n-k)
或者這麼理解劃分:第一個括號裡放k個括號(可以是從0到n - 1)對問題是一個獨立且完備的劃分。f(n) = f(k) f(n -k) k=0..n-1
2)連乘加括號問題
劃分辦法:考慮乘號而不是數,第幾個乘號之前的右括號和最前面的左括號結合。
3)給定一個集合,求可以構造的所有二叉查詢樹的個數:
劃分:分別以每個數為root