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.
算法思想:简单的动态规划
class Solution {
public:
int minPathSum(vector<vector<int> > &grid) {
if(grid.empty())return 0;
int r=grid.size();
int c=grid[0].size();
vector<vector<int>> map(r+1);
for(int i=0;i<=r;i++)map[i].assign(c+1,INT_MAX);
map[0][1]=map[1][0]=0;
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
map[i+1][j+1]=min(map[i][j+1],map[i+1][j])+grid[i][j];
}
}
return map[r][c];
}
};
动态规划+滚动数组
class Solution {
public:
int minPathSum(vector<vector<int> > &grid) {
const int m=grid.size();
const int n=grid[0].size();
int f[n];
fill(f,f+n,INT_MAX);
f[0]=0;
for(int i=0;i<m;++i){
f[0]+=grid[i][0];
for(int j=1;j<n;++j){
//左边的f[j],表示更新后的f[j],与f[i][j]对应
//右边的f[j],表示老的f[j],与f[i-1][j]对应
f[j]=min(f[j-1],f[j])+grid[i][j];
}
}
return f[n-1];
}
};