遞迴和動態規劃 矩陣的最小路徑和

2022-08-10 08:15:12 字數 2311 閱讀 1228

給你乙個二維陣列, 二維陣列中的每個數都是正數, 要求從左上角走到右下角, 每一步只能向右或者向下。 沿途經過的數字要累加起來。 返回最小的路徑和。

解:暴力遞迴

* 因為是從左上角到右下角,只能向右或者向下,

* 可以使用遞迴,

* 把問題簡化為

* 當前位置(i, j)和右邊位置(i + 1, j)和下面位置(i, j + 1)之間的問題

* base case:

* 當i == row - 1 && j == col - 1時,位於矩陣右下角,即為最終結果

* 當i == row - 1時,位於最後一行,此時只能向右走

* 當j == col - 1時,位於最右一行,此時只能向下走

* 當位於矩陣中間某個位置時(i, j),

* 此時要判斷右邊位置(i + 1, j)和下面位置(i, j + 1)中的值誰大誰小

動態規劃

* 是從結果倒推回去推初始狀態

* 1.dp陣列的維度與大小:遞迴中的可變引數是 i, j 兩個,所以dp陣列是二維的 dp[matrix.length][matrix[0].length]

* 2.dp中需要位置為 初始位置(0, 0)

* 3.利用base case把不被依賴的位置標出來:

* 右下角位置

* 4.根據下面的遞迴呼叫分析普遍位置中的依賴關係:

* 最下面一行(row - 1, j)依賴的位置是(row - 1, j + 1)

* 最右邊一列(i, col - 1)依賴的位置是(i + 1, col - 1)

* 當前位置(i, j)依賴的位置有(i + 1, j), (i, j + 1)

暴力遞迴版本:

//正著遞迴

public static int minpath1(int matrix)

public static int path(int matrix, int i, int j)

其實還可以倒著遞迴

改為動態規劃版本:

正著推不被依賴的位置是(0, 0),

普通位置的依賴關係:(i, j) 依賴它左邊(i, j - 1)和上邊(i - 1, j)位置

最終結果是(row - 1, col - 1)

//正著推

public static int dpminpath1(int matrix)

//最上面一行,只能從左邊往右邊走

for(int i = 1; i < col; i++)

//普通的位置(i, j),可以從左邊到達(i, j - 1),也可以從上邊到達(i - 1, j)

for(int i = 1; i < row; i++)

}return dp[row - 1][col - 1];

}

還可以倒著推

不被依賴的位置(row - 1, col - 1)

普通位置的依賴關係:(i, j)依賴它右邊(i, j + 1)和下邊(i + 1, j)的位置

最終結果是(0, 0)位置的值

//倒著推

public static int dpminpath2(int matrix)

system.out.println();

//最下面一行

for(int i = col - 2; i >= 0; i--)

//普通位置的值

for(int i = row - 2; i >= 0; i--)

}return dp[0][0];

}

測試**

生成隨機矩陣

public static int generaterandommatrix(int row, int col)

}return matrix;

}

測試**:

public static void main(string args) , , ,  };

system.out.println(minpath1(m));

system.out.println(dpminpath1(m));

system.out.println(dpminpath2(m));

m = generaterandommatrix(6, 7);

system.out.println(minpath1(m));

system.out.println(dpminpath1(m));

system.out.println(dpminpath2(m));

}

動態規劃 矩陣最小路徑和

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...

動態規劃 矩陣最小路徑和

演算法專題導航頁面 題目描述 給定乙個 n m 的矩陣 a,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,輸出所有的路徑中最小的路徑和。輸入描述 第一行輸入兩個整數 n 和 m,表示矩陣的大小。接下來 n 行每行 m 個整數表示矩陣。輸出描述 輸出乙個...

矩陣的最小路徑和 動態規劃

題目描述 給定乙個 n m 的矩陣 a,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,輸出所有的路徑中最小的路徑和。示例 1,3,5,9 8,1,3,4 5,0,6,1 8,8,4,0 返回值 備註 1 n,m 2000 1 arri,j 100 我的...