題目連結:
題目大意:
一開始有一顆星星,並給定一個正整數N(2 ≦ N ≦ 10, 000)。
求只用複製(Ctrl + C)、貼上(Ctrl + V)使星星數變成N顆的所有最短的方法數。輸出最短需要幾步、有幾個最短的方法數,以及那些最短的方法內容。
註:一旦複製,會是複製當前有的星星數。有一顆就複製一顆,有四顆就複製四顆,總之就是全部複製。
範例輸入:
50
範例輸出:
min : 12
way : 3
Ctrl C + V + C + V + V + V + V + C + V + V + V + V
Ctrl C + V + V + V + V + C + V + C + V + V + V + V
Ctrl C + V + V + V + V + C + V + V + V + V + C + V
解題思維:
用純粹的DFS遞迴就可以過了。
邊遞迴邊記錄目前的方法,然後紀錄下「目前」最短的步數、方法(不一定是整體的最短)。一遇到更短的,就蓋掉之前儲存的。
但是要注意,星星數一旦超過目標要求就不必繼續遞迴,馬上回到上一層的遞迴。
而且「複製」這個動作不能連續做(沒有意義),要判斷現在複製的星星是否與現有的星星數相同。如果一樣就直接執行「貼上」;反之,再各自遞迴「複製」和「貼上」。
本人的程式碼執行時間:3.1S。
似乎還有其他的做法更快。不過目前的DFS還可再最佳化,這部分就交給讀者思考吧。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。