1. 程式人生 > >動態規劃-矩陣最小路徑和

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

題目描述

有一個矩陣map,它每個格子有一個權值。
從左上角的格子開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和。
返回所有的路徑中最小的路徑和。
給定一個矩陣map及它的行數n和列數m,請返回最小路徑和。

求解過程

給定一個N*M的矩陣,假定N等於4,M等於4
1 2 3 4
4 8 3 2
6 1 4 5
7 3 7 8

現在生成一個大小為N*M的矩陣dp, dp[i][j]的含義為從(0,0)點到(i,j)點的最小路徑
顯然 第一行的路徑值就為從0,0點到i,j 每一點值的和

1 3 6 10
1
5
11
18              

置dp[0][0] = 矩陣值[0][0];
對於第一行來說: dp[i][0] = dp[i-1][0] + 矩陣值[i][0];
對於第一列來說: dp[0][i] = dp[0][i-1] + 矩陣值[0][i];
對於除第一行第一列之後其他的位置有: 
    dp[i][j] = min(dp[i-1][j] ,dp[i][j-1])+ 矩陣值[i][j];
至此,狀態轉移方程求解完畢

程式碼實現

class MinimumPath 
{
public:
    int getMin(vector<vector<int> > juzhen, int n, int m)
     {
        vector<vector<int> >dp(n,vector<int>(m,0));
        dp[0][0] = juzhen[0][0];
        for (int i=1; i<n; ++i)
            dp[i][0] = dp[i-1][0] + juzhen[i][0];
        for
(int i=1; i<m; ++i) dp[0][i] = dp[0][i-1] + juzhen[0][i]; for(int i=1; i<n; ++i) { for (int j=1; j<m; ++j) { dp[i][j] = min(dp[i][j-1], dp[i-1][j]) + juzhen[i][j]; } } return dp[n-1][m-1]; } };