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],即是到右下角单元格,最小路径和。