給定乙個矩陣matrix,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中的最小路徑和。
如果給定的矩陣matrix如下:
其中路徑1,3,1,0,6,1,0是所有路徑中路徑和最小的,所以返回12。下面我們使用遞迴的方法來處理這個問題。假設現在矩陣matrix有點a(i,j),我們要求得點a(i,j)到矩陣右下角的點b的路徑和,需遵循如下規律:
要求得點a(i,j)到點b的路徑和,首先要求得點a的右邊的點到點b的路徑和right,以及點a下面的點到點b之間的路徑和down。那麼最後點a到點b的路徑和記為min + a(i, j);
當點a(i, j)到達最後一行時,它已經不能向下移動而只能向右移動,其路徑和為點a加上其右邊的點到點b的路徑和;
當點a(i, j)到達最後一列時,它已經不能向右移動而只能向下移動,其路徑和為點a加上其下面的點到點b的路徑和。
下面是求矩陣最小路徑和的遞迴**,具體如下所示。
// 包含大量重複計算
private
static
intgetminpathcore1
(int
matrix,
int row,
int col,
int rows,
int cols)
if(row == rows -1)
return matrix[row]
[col]
+getminpathcore1
(matrix, row, col +
1, rows, cols);if
(col == cols -1)
return matrix[row]
[col]
+getminpathcore1
(matrix, row +
1, col, rows, cols)
;int right =
getminpathcore1
(matrix, row, col +
1, rows, cols)
;int down =
getminpathcore1
(matrix, row +
1, col, rows, cols)
;return matrix[row]
[col]
+ math.
min(right, down);}
public
static
intgetminpath1
(int
matrix)
分析如上遞迴**,我們會發現有許多重複的計算,比如下面遞迴過程中有1 -> 3 -> 1 -> …和1-> 8 - > 1 - > …等多條路徑。顯然從(1,1)到右下角的路徑和被計算了多次。
為了處理這種效果很差的遞迴,下面我們介紹經典動態規劃方法。動態規劃從暴力遞迴中來,它會將每乙個子問題的解記錄下來,避免重複計算。對於上面的矩陣matrix,我們建立乙個同等大小的矩陣dp,其中dp[i][j]的值表示從左上角(即(0,0))位置走到(i, j)位置的最小路徑和。顯然對應於矩陣matrix第一行的元素來說,只能從(0,0)向右走到(0,j),所以dp矩陣的第一行的元素dp[0][j]即為matrix[0][0…j]的和,dp矩陣的第一列同理。因此以題目的例子來說,dp矩陣的第一行和第一列的值如下:
除了第一行和第一列的其他位置的元素(i,j),都有上邊位置(i - 1,j)和左邊位置(i,j - 1)。因為從(0,0)到(i,j)的路徑必然經過位置(i - 1, j)或(i,j - 1),所以dp表除了第一行和第一列之外的元素都符合dp[i][j] = min + matrix[i][j]。以本題的例子來說,最終生成的dp矩陣如下:
dp矩陣最右下角的值就是整個問題的答案。具體過程參看如下**:
public
static
intgetminpath2
(int
matrix)
int rows = matrix.length;
int cols = matrix[0]
.length;
int[
] dp =
newint
[rows]
[cols]
; dp[0]
[0]= matrix[0]
[0];
for(
int i =
1; i < rows; i++
)for
(int j =
1; j < cols; j++
)for
(int i =
1; i < rows; i++)}
//printmatrix(dp);//for test
return dp[rows -1]
[cols -1]
;}
矩陣的最小路徑和
準備校招的!這些是一本書的筆記 程式設計師 面試指南 it名企演算法與資料結構題目最優解 左程雲 給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和 舉例 如果給定的m如下 135 9 813 4 506 1 8...
矩陣的最小路徑和
給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。方法一 遞迴 coding utf 8 defsolution m,l n l m 0 0 if len m 1 and len m 0 1 return l ...
矩陣的最小路徑和
題目 給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後達到右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。舉例 給定的m如下 1 3 5 9 8 1 3 4 5 0 6 1 8 8 4 0 路徑1,3,1,0,6,1,0是所有路徑中路徑和最小的,所以返回12。...