Minimum Path Sum
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.
还是DP问题,给定一个m*n的二维数组,每一个值都是非负数。问从起点(左上角)到终点(右下角)的一条路径上所有的数加起来的和最小是多少?
解题思路:
参考 Unique Path Two题目的解法 在那个基础上:
以中间的某一个点A来考虑,A左边是B,A上边是C,假设B和C的结果已经求出来了,那么A的结果应该等于B和C中结果较小的那个加上A位置的给定值。
特殊的是:
第一行中,除第一个点的所有的点的结果等于前一个点的结果加上本身的给定值。
第一列中,除第一个点的所有的点的结果等于上一个点的结果加上本身的给定值。
(描述起来好绕口的说…………)
画图来理解:
代码如下:
空间复杂度:O(n)
class Solution { public: int minPathSum(vector<vector<int> > &grid) { int m = grid.size(); int n = grid[0].size(); vector<int> dp(n,0); for(int i = 0; i < m;i++){ for(int j = 0; j < n; j++){ if(j == 0){ dp[j] = dp[j] + grid[i][j]; } else if(i == 0){ dp[j] = dp[j-1] + grid[i][j]; } else{ dp[j] = min(dp[j-1],dp[j]) + grid[i][j]; } } } return dp.back(); } };
上面的比较容易理解,下面的代码其实是一个道理:
class Solution { public: int minPathSum(vector<vector<int> > &grid) { int m = grid.size(); int n = grid[0].size(); vector<int> dp(n+1,INT_MAX); dp[1] = 0; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ dp[j+1] = min(dp[j],dp[j+1]) + grid[i][j]; } } return dp.back(); } };