最小路徑和的三種解法(動態規劃入門篇)

2021-09-27 02:52:48 字數 1526 閱讀 5645

給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

說明:每次只能向下或者向右移動一步。

輸入:[

[1,3,1],

[1,5,1],

[4,2,1]

]輸出: 7

解釋: 因為路徑 1→3→1→1→1 的總和最小。

這道題,我能想到的一共三種解法。

首先,這很類似與迷宮的問題,很顯然可以使用遞迴來解決,我們可以把所有可能到達右下角最後乙個元素的路線的權值和都計算出來,然後取最小的乙個。可以優化在遞迴的過程中,就記錄最小值,某條路徑遞迴的一半就比這個最小值大或者小,那麼我們就終止遞迴。

這種方式的時間複雜度為o(2^m+n),空間複雜度為為o(m+n)

第二種,這道題很顯然是乙個動態規劃的問題,到達最後乙個元素(n,m)的最短路徑,要取決於到達(n - 1,m)和(n,m - 1)的元素的最短路徑,如果要求不破壞原有的資料,我們可以再定義乙個同樣大小的二維陣列,從最後一行開始,從後往前遍歷所有的元素,每乙個元素都記錄右下角到這個節點的最短路徑,最後返回(0,0)個元素就可以了。(一維陣列也可以實現)

這種方式的時間複雜度為o(mn),空間複雜度為為o(mn)(一維陣列的話空間複雜度為o(m))

如果不需要保留原來的資料結構,我們可以在題目中的二維陣列直接修改,這樣空間複雜度為o(1)

第一種-遞迴優化版本

class solution 

private void recursive(int grid, int i, int j, int sum)

if (i == grid.length - 1 && j == grid[0].length - 1)

// 優先向下走

if (i < grid.length - 1)

// 上路走不通再向下走

if (j < grid[0].length - 1) }}

第二種-二維陣列動態規劃

class solution  else if (i == grid.length - 1 && j < grid[0].length - 1)  else if (i < grid.length - 1 && j == grid[0].length - 1)  else }}

return dp[0][0];}}

第三種-動態規劃-原地修改

動態規劃 最小路徑和

給定乙個只含非負整數的m n網格,找到一條從左上角到右下角的可以使數字和最小的路徑。你在同一時間只能向下或者向右移動一步 樣例1 1 3 1 1 5 1 4 2 1 輸出 7 樣例2 1 3 5 9 8 1 3 4 5 0 6 1 8 8 4 0 輸出 12 計算到達當前位置路徑,是在上一步的基礎上...

最小路徑和 動態規劃

給定乙個包含非負整數的m n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總合為最小.說明 每次只能向下或者向右移動一下.示例 輸入 1,3,1 1,5,1 4,2,1 輸出 7解釋 因為路徑 1 3 1 1 1 的總和最小。解法一 動態規劃思想因為最近在做動態規劃的專題,所以用動態規劃...

動態規劃 矩陣最小路徑和

int min int a,int b int getmin vector map,int n,int m dp 0 0 map 0 0 for int i 1 i m i dp 0 i dp 0 i 1 map 0 i for int i 1 i n i dp i 0 dp i 1 0 map i...