1. 程式人生 > >【算法專題】卡特蘭數(計數數列)

【算法專題】卡特蘭數(計數數列)

n-1 映射 點分治 blog -s 方法 .org div n-k

Catalan數列:1 1 1 2 5 14 42 132 429 1430 4862 16796

【計數映射思想】

參考:卡特蘭數 — 計數的映射方法的偉大勝利

計數映射:將難以統計的數映射為另一種形式的可以統計的數。

一、入棧出棧序

n個數字,有多少種合法的入棧出棧序列?n=3時的合法序列之一:+1,-1,+1,+1,-1,-1

對於n個數字,就是要在2n個1中添加n個“+”,則序列總數C(2n,n)。

對於未入棧先出棧的不合法情況,在其第一次前綴和為-1時,將前面的所有符號反轉,此時整個序列有n+1個“+‘和n-1個’-‘,每個不合法序列都映射為2n個1中添加n+1個‘+‘構成的序列。

正向:每個不合法序列第一個前綴和為-1的位置反轉後,形成的序列不同。

反向:每個含n+1個"+"的序列,第一個前綴和為1的位置反轉後,形成的不合法序列不同。

所以得到卡特蘭數:Cn=C(2n,n)-C(2n,n-1)=C(2n,n)/(n+1)

例一、含n+1個節點的滿二叉樹形態數:中序遍歷,向左+1向右-1,轉化為入棧出棧序。

例二、圓上n個點連弦數:順時針順序每次+1和-1連弦,轉化為入棧出棧序。

例三、n對括號表達式:左括號+1右括號-1,括號表達式組合數轉化為入棧出棧序。

例四、n+1個數字連乘:結合n次即有n對有效括號,轉化為括號表達式。

例五、凸n+2邊形的三角剖分數:對邊進行編號,然後順時針掃描,實際上是n+1條邊的連乘方案,轉化為入棧出棧序。

二、不跨線路徑數(幾何模型)

入棧出棧序:考慮n*n的方格,從左下到右上不跨越對角線的路徑數,向右記為+1,向上記為-1,跨越對角線就是前綴和為-1,則轉化為入棧出棧序。

考慮n*m的方格,一條不合法路徑在第一次跨越對角線的時候,將前面的路徑翻轉(上變左,左變上),那麽就變成了到(n-1,m+1)的路徑數。

那麽f(n,m)=C(n+m,n)-C(n+m,n-1)。

【分治思想】

一個問題A,規模為n,可以用分治的思想,先固定一個元素,然後將剩下n-1個元素拆分成兩個問題,根據固定的元素位置不同,兩個問題分別是(0,n-1)(1,n-2)...(n-1,0)。

例一、入棧出棧序:固定最後出棧的數字是第k個加入的數,那麽k前面是k-1個數的入棧出棧序問題,k後面是n-k個數的入棧出棧序問題,則有:

C(n)=C(0)*C(n-1)+C(1)*C(n-2)+...+C(n-1)C(0),即C(n)=ΣC(i)*C(n-i-1),i=0~n-1,C(0)=1

例二、凸n+2邊形三角剖分數:先固定三角形V1VkVn+2,劃分成凸k多邊形和凸n+2-k邊形,轉化為Cn。

★總結:Catalan數的題目,一般從幾種方式看出:轉化為入棧出棧序,轉化為幾何不跨線路徑數,定點分治思想,打表

【算法專題】卡特蘭數(計數數列)