分析
f[i][j]表示从(0,0)坐标到(i,j)的最小和,每次转移都从f[i-1][j]或者f[i][j-1]转移过来,两者取最小值即可。
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m=grid.size(),n=grid[0].size();
vector<vector<int>> f(m, vector<int>(n));
f[0][0]=grid[0][0];
for(int i=1;i<m;i++){
f[i][0]+=f[i-1][0]+grid[i][0];//初始化第一列
}
for(int i=1;i<n;i++){
f[0][i]=f[0][i-1]+grid[0][i];//初始化第一行
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
f[i][j]=min(f[i-1][j],f[i][j-1])+grid[i][j];//转移方程
}
}
return f[m-1][n-1];
}
};