这个题是从左上角到右下角的路径和最小,实际就是一道dp题。
第一种写法是只初始化(0,0)位置,第二种写法则是把第一行、第一列都初始化了。个人更喜欢第二种写法,简单一点。
dp的右下角的值就为最终的值
第一种写法:
class Solution { public: int minPathSum(vector<vector<int>>& grid) { int rows = grid.size(); if(rows <= 0) return -1; int cols = grid[0].size(); if(cols <= 0) return -1; vector<vector<int> > result(rows,vector<int>(cols)); result[0][0] = grid[0][0]; for(int i = 0;i < rows;i++){ for(int j = 0;j < cols;j++){ if(i != 0 && j != 0) result[i][j] = grid[i][j] + min(result[i-1][j],result[i][j-1]); if(i == 0 && j != 0) result[i][j] = result[i][j-1] + grid[i][j]; if(j == 0 && i != 0) result[i][j] = result[i-1][j] + grid[i][j]; } } return result[rows-1][cols-1]; } };
第二种写法:
class Solution { public: int minPathSum(vector<vector<int>>& grid) { int m = grid.size(); if(m <= 0) return 0; int n = grid[0].size(); if(n <= 0) return 0; vector<vector<int> > dp(m,vector<int>(n)); dp[0][0] = grid[0][0]; for(int i = 1;i < m;i++) dp[i][0] = dp[i-1][0] + grid[i][0]; for(int i = 1;i < n;i++) dp[0][i] = dp[0][i-1] + grid[0][i]; for(int i = 1;i < m;i++){ for(int j = 1;j < n;j++){ dp[i][j] = grid[i][j] + min(dp[i-1][j],dp[i][j-1]); } } return dp[m-1][n-1]; } };