1. 程式人生 > >學習筆記第十八節:卡特蘭數

學習筆記第十八節:卡特蘭數

前話

      本樓主是蒟蒻,居然最近才搞了卡特蘭數,在這裡總結一下,最基礎的總結。

正題

      定義卡特蘭數為:h(n)

      卡特蘭數的遞推式是:h(n)=\sum_{i=0}^{n-1}h(i)*h(n-i-1)

      然後有人證出來了一個樸素的遞推公式:h(n)=\frac{(4n-2)*h(n-1)}{n+1}

      是不是很神奇,為什麼呢?

      我也不會,畢竟那個不是我。

      接著,經過不斷摸索,有人解出來了這個遞推式的解:h(n)=\frac{C(2n,n)}{n+1}=C(2n,n)-C(2n,n-1)

      是不是很神奇,為什麼呢?

      我也不會,畢竟那個不是我。

      卡特蘭數就是這樣一個很神奇的東西。

      如果在比賽中發現一組線性答案長得是這樣的:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012……

      那麼你就可以簡單的斷定它的答案是可以O(1)算的

應用

      如果在比賽中不想找規律呢?

      那麼您就要先掌握幾個簡單的應用以至於在比賽中不會懵逼簡單地Ak。

    第一個:

      n個0和n個1,求有多少種方案使得每個字首的 total_1>=total_0

      首先,全部方案是C(2n,n),很明顯的

      其次,討論不滿足的,存在一個奇數2k+1

使得前2k+1箇中有k個1和k+1個0。

      把後面的位都取反,就會變得一共有n+1個0和n-1個1。

      反過來,一個有 n+1個0和n-1個1肯定對應一個唯一的不滿足的序列。

      因為存在一個奇數使得前面的0比1多,然後把後面翻轉過來又變成n個0和n個1的序列。

      所以不成功的方案數就是:C(2n,n+1)=C(2n,n-1)

      成功方案就是:C(2n,n)-C(2n,n-1)=h(n)

    第二個:

      一個n個節點的二叉樹的形態總數有多少?

      明顯選取一個點做根,兩邊分別Dp即可。

      f(n)=\sum_{i=0}^{n-1}f(i)*f(n-i-1) =h(n)

       所以答案就是卡特蘭數。

       還有很多很多,比如說:平面直角座標系上跑有多少種方案,三角形劃分,區域劃分,大多都是運用公式本身的性質體現出來的卡特蘭數,或者在比賽中隱藏的找規律,需要做題練習。