組合數學——POJ 3088

最近做數學題很來可樂,所以又來發幾篇文章:
組合數學:
 題意:

  給出一個整數B (1<=B<=11), 表示有1 2 3 ... B 這B個數, 可選擇其中的N (1<=N<=B)個數(不用按順序), 並用若干個括號將它們括起來.

    如B = 2 時:

      有 (1), (2), (12), (1)(2), (2)(1) 這5種情況

  要求出所有情況的總數.

解題思路:

  看懂題意後, 馬上做的是找算公式找規律, 但式子很複雜,就算了......後來找出了一條DP式如下:

    設D[i] 表示有 i 個數時可以組成的所有情況總數

    那麼有

      D[i] = C(i, 1) * D[1] + C(i, 2) * D[2] + .. C(i, i - 1) * D[i - 1] + 1;(感覺和)

    (從別算出從i 個數中選取 k個的取法總數, 即C(i, 1), 而前邊已算出D[k]的個數, 那麼從i個數中選取k個數之後用括號括題來的總數爲C(i, k) * D[k]).

    其實上面的遞推式是錯誤的......

    我是從小數推出來的,其實最後不應該加1,上面的式子忽略了從i個數中選取i個數的情況, 也就是 +1是錯誤的, 正確應該是+2^i - 1....... 

 

 

最後說一句,小牛們可以打表過......

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章