切換
舊版
前往
大廳
主題

ZeroJudge - d522: 走棋盤 解題心得

Not In My Back Yard | 2020-06-27 00:22:51 | 巴幣 0 | 人氣 237

題目連結:


題目大意:
第一列先給定兩正整數 n 、k (1 ≦ n ≦ 100 , 0 ≦ k ≦ n),代表有一個 n × n 個矩陣。緊接著(從第一列開始)的 n 列輸入,每列給定 n 個整數,代表這 n × n 矩陣的內容。

現在,從矩陣最左上角開始,每次移動可以往上下左右跳至多 k 格的距離。每次移動到的新位置所對應的值必須大於移動前在的位置之值。試問在最佳的走法下,路徑上的所有數字之總和最大為多少?



範例輸入:
2 2 2 3
4 5


範例輸出:
11


解題思維:
窮舉並遞迴現在的位置能到的格子:往上 1 格、往上 2 格 、 …… 、 往上 k 格,其他以此類推。然後先檢查有沒有超出矩陣的範圍,有的話就不用繼續往同方向前進。接著檢查新的格子的數字有沒有大於現在的數字。有的話就遞迴下去……倒也不需要這麼急。

可以看到在某些情形下,我們會重複地遞迴相同位置的格子。而該格子的其後的結果一定是固定的(因為被題目的移動條件所限制)。所以每遞迴完一個格子後,紀錄下該格所能經過的數字之最大總和。這樣之後遞迴到相同格子,只要直接加上先前紀錄的最大總和,不須再遞迴一次。當然,沒走過的格子還是要繼續往下遞迴下去的。

遞迴完之後,最左上角的位置儲存的最大總和即是所求。

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

創作回應

更多創作