切換
舊版
前往
大廳
主題

ZeroJudge - b219: 4. 工作順序問題 解題心得

Not In My Back Yard | 2019-03-10 16:55:22 | 巴幣 2 | 人氣 180

題目連結:


題目大意:
給定兩正整數 n 、 m (1 ≦ n ≦ 10, 000, 000 、 1 ≦ m ≦ 1, 000, 000, 000),代表有 n 件工作,編號依序為 1 ~ n 。

而現在 L 小姐想完成這 n 件工作。但是按照她的個性,當完成了編號為 i 的工作,一定不會緊接著去完成第 i + 1 個工作。

求 L 小姐有多少方法(順序)完成這 n 件工作。將方法數取除以 m 的餘數。


範例輸入:
輸入範例1:
3 1000
輸入範例2:
4 7


範例輸出:
輸出範例1:
3
輸出範例2:
4


解題思維:
典型的數學上之遞迴的問題,也是程式解題經典的動態規劃題。

假設已經知道完成 i 件和 i - 1 件工作的方法數(以下稱 D 、 Di - 1 ),則我們可以觀察出 i + 1 件工作的方法數有以下的規律:
第 i + 1 件工作不是第 i + 1 個完成時,我們可以從剩下的 i 件工作選出 i 個縫隙去插入這個工作(已扣除最後的位置)。因此有 D × i 種方法
第 i + 1 件工作是第 i + 1 個完成時,第 i 個工作不能是第 i 個完成的(會跟規則衝突)。與上同理,會有 Di - 1 × (i - 1)種方法

因此我們總合以上的可能性,得出:
i + 1 = D × i + Di - 1 × (i - 1)。
且已知 D = 1 、 D = 1 ,因此我們可以推得 D 。剩下的就只要每次做運算時,去取 m 的餘數即可。

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

創作回應

更多創作