leecode 每日解題思路 64 Minimum Path Sum


題目描述:

題目鏈接:64 Minimum Path Sum

  問題是要求在一個全為正整數的 m X n 的矩陣中, 取一條從左上為起點, 走到右下為重點的路徑, (前進方向只能向左或者向右),求一條所經過元素和最小的一條路徑。

其實,題目已經給出了提示:, 動態規划應該是最直接的解法之一。

 

 

  這邊我們了解到, 問題中只允許走到的每個點右移或者下移,這就意味着從起點開始, 都有兩種后繼路徑(最后一行和最后一列除外),以此類推, 得到所有路徑,然后取其中路徑和雖小的值,就可以得到結果了。 但是!我們仔細想想,如果這么求解問題的話, 對於一個N X N 的矩陣, 他的可能路徑條數有幾條?(想想N層的二叉樹的路徑有幾條)所以用這個思路的話, 可行, 但是不推薦,因為數據成長是O(2^N)的, 太可怕。

  再想想,前面提到:

其實就是意味着: 從終點開始往前推, 都有兩種前驅路徑(第一行和第一列除外),最后一個點只可能從上邊走下來,即為path_top或者從左邊走過來path_left, 至於走哪條路, 自然是哪一條路徑和小,就選擇哪一條。

對於最后一個點1上邊路徑的最佳結果,已經從上邊的紅色區域中的帶哦並累計到3這個點(另外需要一個路徑和矩陣做記錄)

對於最后一個點左邊最小路徑的結果,已經從左邊的紅色區域中得到並累積到8這個點(另外需要一個路徑和矩陣做記錄)

 

而對於以上紅色區域的最后一個點, 也同樣是從上層區域和左邊區域已經求得的最優解來進行2選一操作, 做成最優解。

就像這樣:

然后一直重復, 直到起點。

所以,對於(M,N)點處的結果, 必然是從(M-1)*N 矩陣 和 M* (N-1)矩陣中求取的, 

ok, 推理到這一步, 其實問題已經解決了, 所有的問題都是從起點開始, 所有的點都是由之前點上的路徑和決定的。

 

從最簡單的情形開始:對於一個2*2的舉證, [0,0] 決定了[0,1]和[1,0], 

這樣[1,1]的最小值肯定是從[0,1]的4 和 [1, 0]的7中比較取值, 所以最后的到在終點[1,1]的最小取值4+2 = 6;

我們定義對於走到每個點的最小路徑和矩陣path_sum[m][n], 以及給出的每個點上的值矩陣matrix[m][n]

得到: path_sum[i, j] =  min(path_sum[i-1][j], path_sum[i][j-1]) + matrix[m][n]

(注意, 上式中為處理邊界是的情況, 只指出此遞推式的核心步驟);

說的可能有點亂, 但核心思想就是盡然你每個非邊界的點只能往后兩條去路, 那必然非邊界的每個點都肯定也只有兩條來路, 

最優解就是這兩條來路里面2選一, done!

 

下面是個人的solution 代碼, 僅供參考

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM