切換
舊版
前往
大廳
主題

ZeroJudge - a557: NCPC PB Integer Partition 解題心得

Not In My Back Yard | 2019-07-22 22:57:43 | 巴幣 0 | 人氣 303

題目連結:


題目大意:
給定一正整數 m (m ≦ 5),代表有 m 筆測試資料,每筆佔一列輸入。每列輸入給定三正整數 y 、 i 、 z (1 ≦ y ≦ 500 , 1 ≦ i ≦ 50 , 1 ≦ z ≦ 100),分別代表欲分解的數、分解出來的個數,以及數值最大的部分的數字上界。

即 y = a + a + …… + a , 且 z ≧ a ≧ a ≧ …… ≧ a ≧ 1 。求有多少組 a 、 a 、 …… 、 a



範例輸入:
5
20 4 7
100 50 51
487 18 87
492 19 89
500 19 90


範例輸出:
13
204226
7139824136004762
20430740394679891
25985433353057732


解題思維:
首先,先看看這題以便理解以下的預設概念。

定義一個二維陣列 Di, j , i 代表要分解的數字、j 代表分解出來的和之個數,而 Di, j 本身代表 i 分解為 j 個數字的和的方法數。

而從拉瑪努金那一題(上面連結到的題目)當中的 DP 式(不是遞迴式,因為不是由上往下(Top-Down)的求解(此為一般遞迴))稍作改動變為:
初始: D0, 0 = 1
for a = 1 → z :
 for b = i → y :
  for c = 1 → i :
     Db, c = Db, c + Db-a, c-1
也就是我們將分解的部分之「開頭」限制在 z 以下(含),並記錄每種分解長度的方法數。最後推得的 Dy, i 即是所求。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

胖胖貓
答案的連結放錯囉~~
2019-07-23 23:41:15
Not In My Back Yard
唉呀,感謝提醒XD
2019-07-24 00:00:23

相關創作

更多創作