#week13
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
Example 1:
[[1,3,1], [1,5,1], [4,2,1]]
Given the above grid map, return 7
. Because the path 1→3→1→1→1 minimizes the sum.
分析:
这个动态规划的状态转换很明显:
sum[i][j] = min(sum[i - 1][j], sum[i][j - 1]) + grid[i][j];
要么从上面走过来要么从左边走过来,才能够得到最小的,因为边的权值为正数,所以不可能是右边和下面
然后最后的结果就是sum[m - 1][n - 1]
题解:
1 class Solution { 2 public: 3 int minPathSum(vector<vector<int>>& grid) { 4 int m = grid.size(); 5 int n = grid[0].size(); 6 vector<vector<int> > sum(m, vector<int>(n, grid[0][0])); 7 for (int i = 1; i < m; i++) 8 sum[i][0] = sum[i - 1][0] + grid[i][0]; 9 for (int j = 1; j < n; j++) 10 sum[0][j] = sum[0][j - 1] + grid[0][j]; 11 for (int i = 1; i < m; i++) 12 for (int j = 1; j < n; j++) 13 sum[i][j] = min(sum[i - 1][j], sum[i][j - 1]) + grid[i][j]; 14 return sum[m - 1][n - 1]; 15 } 16 };