切換
舊版
前往
大廳
主題

ZeroJudge - d304: 複製貼上 解題心得

Not In My Back Yard | 2018-10-07 11:18:42 | 巴幣 0 | 人氣 238

題目連結:


題目大意:
一開始有一顆星星,並給定一個正整數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還可再最佳化,這部分就交給讀者思考吧。

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

創作回應

胖胖貓
這一題和 d741 是相同的題目只是 d741: 复制贴上——加强版 擺明就不能用DFS
這邊初步觀察可以發現和 上限的質因數有關連
但僅止於這樣是不夠的, 請一併觀察2的次方向項時方法數的變化找到規律
用同一套解法放到 d304+預跑並儲存全部的解法就可以把時間壓到最低, 但記憶體超大XD
2018-10-29 11:24:08
Not In My Back Yard
感謝分享,還真的是沒想到XD
2018-10-29 12:52:58

更多創作