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.
和之前的unique path的解题思路相似,呼之欲出的解决方法-动态规划大法。
代码如下:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
if(grid.empty())
return 0;
int m = grid.size();
int n = grid[0].size();
int dp[m][n];
memset(dp,0,sizeof(int)*m*n);
dp[0][0] = grid[0][0];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(i-1 >= 0 && j-1 >= 0)
{
if(dp[i-1][j] < dp[i][j-1])
dp[i][j] += dp[i-1][j] + grid[i][j];
else
dp[i][j] += dp[i][j-1] + grid[i][j];
}
else if(i-1 >= 0)
{
dp[i][j] += dp[i-1][j]+grid[i][j];
}
else if(j-1 >= 0)
{
dp[i][j] += dp[i][j-1]+grid[i][j];
}
}
}
return dp[m-1][n-1];
}
};
上述动态规划方法需要使用O(m*n)的内存空间,通过对其优化,可以只使用O(m)或O(n)的内存空间即可。
代码如下:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid[0].size();
int v[m];
memset(v,0,sizeof(int)*m);
v[0] = grid[0][0];
for(int i=1;i<m;i++)
v[i] = v[i-1]+grid[i][0];
for(int j=1;j<n;j++)
{
v[0] += grid[0][j];
for(int i=1;i<m;i++)
{
if(v[i-1] < v[i])
v[i] = v[i-1]+grid[i][j];
else
v[i] = v[i] + grid[i][j];
}
}
return v[m-1];
}
};