矩陣的最小路徑和

2021-09-24 20:57:40 字數 2746 閱讀 7577

給定乙個矩陣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。...