leecode 每日解題思路 64 Minimum Path Sum

題目描述:spa

題目連接:64 Minimum Path Sumcode

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

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

 

 

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

  再想一想,前面提到:io

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

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

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

 

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

就像這樣:

而後一直重複, 直到起點。

因此,對於(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 代碼, 僅供參考

相關文章
相關標籤/搜索