卡特蘭數(Catalan Number)是一連串整數序列,其通項公式爲
前幾項爲(從0開始):
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
應用
-
Duck Word: 設一個字符串長度爲2n,分別由n個x和y組成,求所有的前綴子串皆滿足x的個數大於等於y的個數,帶入公式計算,假設n=3:
可以看出共有5種情況,以下設這五種序列
XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY -
將上述的X換成左括號,Y換成右括號,就可以將問題改成求有多少組包含n組括號的合法運算公式個數
((())) ()(())() ()()() (())() (()()) -
n個節點組成的不同構二叉樹個數
-
2n+1個節點組成的不同構滿二叉樹個數
注意:這裏的滿二叉樹定義爲:只含有葉子節點以及度爲0的節點的二叉樹
以上均爲滿二叉樹,只含有度爲0和2的結點,不含有度爲1的結點 -
通過連結頂點而將n + 2邊的凸多邊形分成三角形的方法個數
上圖所示,六邊形爲Catalan(4),共有4中劃分方法 -
表示n個元素的進出棧置換個數
-
表示所有在n × n格點中不越過對角線的單調路徑的個數
上圖n=4,結果爲Catalan(2n)
遞推公式:
做題數據不大的時候可以BigInteger打表O(∩_∩)O
BigInteger[] a=new BigInteger[105];
a[0]=BigInteger.ONE;
for(int i=1;i<101;i++) {
a[i]=a[i-1].multiply(BigInteger.valueOf(4*i-2)).divide(BigInteger.valueOf(i+1));
}