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.
思路:简单动态规划,考虑用 vector 代替数组,来节省空间。
//数组版,13ms
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
long long dp[300][300];
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 j=1;j<n;j++)
dp[0][j] = dp[0][j-1]+grid[0][j];
//处理中间部分
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + grid[i][j];
}
}
return dp[m-1][n-1];
}
};
//vector版,9ms
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(), n = grid[0].size();
vector<vector<int> > dp;
vector<int> line0;
line0.push_back(grid[0][0]);
dp.push_back(line0);
//初始化边界
for(int i=1;i<m;i++)
{
vector<int> tmp;
tmp.push_back(dp[i-1][0]+grid[i][0]);
dp.push_back(tmp);
}
for(int j=1;j<n;j++)
dp[0].push_back(dp[0][j-1]+grid[0][j]);
//处理中间部分
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
dp[i].push_back(min(dp[i-1][j],dp[i][j-1]) + grid[i][j]);
}
}
return dp[m-1][n-1];
}
};