给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
1 输入: 2 [ 3 [1,3,1], 4 [1,5,1], 5 [4,2,1] 6 ] 7 输出: 7 8 解释: 因为路径 1→3→1→1→1 的总和最小。
思路:递推方程F(m,n)=min(F(m-1,n),F(m,n-1))+grid(m,n)
1 class Solution { 2 public: 3 int minPathSum(vector<vector<int>>& grid) { 4 //F(m,n) = min(F(m-1,n),F(m,n-1))+1; 5 int m = grid.size(); 6 if(m == 0) return 0; 7 int n = grid[0].size(); 8 vector<vector<int>> dp(m,vector<int>(n,0)); 9 dp[0][0] = grid[0][0]; 10 for(int i = 1; i < m ;++i){ 11 dp[i][0] = dp[i-1][0] + grid[i][0]; 12 } 13 for(int j = 1; j < n ; ++j) { 14 dp[0][j] = dp[0][j -1] + grid[0][j]; 15 16 } 17 for(int i = 1; i< m ;++i) { 18 for(int j = 1; j < n;++j) { 19 dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j]; 20 } 21 } 22 return dp[m - 1][n - 1]; 23 } 24 };
update 2020/07/23
几个月后再来做这题,感觉没啥问题。