class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int row=grid.size();
        int col=grid[0].size();
        int N=1000;
        int D[N][N];
        D[0][0]=grid[0][0];
        for(int j=1;j<col;j++){
            D[0][j]=D[0][j-1]+grid[0][j];
        }
        for(int i=1;i<row;i++){
            D[i][0]=D[i-1][0]+grid[i][0];
        }
        for(int i=1;i<row;i++){
            for(int j=1;j<col;j++){
                D[i][j]=min(D[i][j-1],D[i-1][j])+grid[i][j];
            }
        }
        return D[row-1][col-1];
    }
};

 补充一个python版本:

 1 class Solution:
 2     def minPathSum(self, grid: 'List[List[int]]') -> 'int':
 3         m = len(grid)
 4         n = len(grid[0])
 5         dp =[[0 for col in range(n)] for row in range(m)]
 6         dp[0][0] = grid[0][0]
 7         for i in range(1,m):
 8             dp[i][0] =  dp[i-1][0] + grid[i][0]
 9 
10         for j in range(1,n):
11             dp[0][j] = dp[0][j-1] + grid[0][j]
12         
13         for i in range(1,m):
14             for j in range(1,n):
15                 dp[i][j] = min(dp[i][j-1],dp[i-1][j]) + grid[i][j]
16         return dp[m-1][n-1]

dp是二维数组,每一个元素表示:从起点[0][0]开始,到当前单元格,最小的路径长度。

由于只能向“右”和“下”移动,而且没有负的权值。

因此,

第一行只能按照从左到右顺序,才能获得最小。

第一列,只能按照从上到下顺序,才能获得最小。

而其他单元格,可能有两种策略:

策略1:从上面过来;

策略2:从左面过来。

两种策略的选择依据是,“上面”与“左面”两者较小的,这个较小的值 + 当前元素值,即为dp值。

最终返回dp[m-1][n-1],即是到右下角单元格,最小路径和。

posted on 2018-10-12 14:25  Sempron2800+  阅读(140)  评论(0编辑  收藏  举报