切換
舊版
前往
大廳
主題

ZeroJudge - c188: 拉瑪努金的逆襲 解題心得

Not In My Back Yard | 2019-01-07 23:42:47 | 巴幣 0 | 人氣 615

題目連結:


題目大意:
有多列的輸入。每列輸入有一正整數 N ( N ≦ 200 ),求 N 的整數分拆之方法數。



範例輸入:
0
1
200



範例輸出:
1
1
3972999029388



解題思維:
以下三行程式碼可以求出任意 N 的整數分拆方法數(N ≦ 200):
(其中 answer[0] 一開始為 0 ,answer[1] ~ answer[200] 一開始都設為 0 )
for (int i = 1; i <= 200; i++)
 for (int j = i; j <= 200; j++)
  answers[j] += answers[j - i];

以下圖示可以稍微表示以上程式碼的運行模式(不過下圖左上角的i、j要交換):
由上可以看到,第一次(迴圈外層的 i 值,也就是 i = 1 時)是在為每個數字找 1 開頭的拆分方法; 外迴圈的i = 2 時,內迴圈則是找 2 開頭的方法……以此類推。

而我們可以看到 i = 2 時,answer[5] 的方法數要加上 answer[3] 的方法數。這是因為我們要找開頭是 2 的方法,也就是剩下的結尾數字總和為 5 - 2 = 3,而 3 的方法數在前面已經跟 3 - 2 = 1 的方法處理過了。因此 answer[5] 的方法數要加上 answer[3] 的方法數。

而 i 為任意數字時也是與上同理。



全部可能的 N 值(1 ~ 200)都跑過一次後,接下來就是看輸入什麼數字,就輸出相應的答案即可。

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

創作回應

相關創作

更多創作