DP思想:
对于第一行和第一列 都是从左往右 ,从上到下累加。
然后对于其他的每个格子: 其值 为 它上面一个的值 和左边一格值的最小值 加上本格子的值。
这是一题非常简单的DP题,用来练思维是再好不过了。
能 AC~ 真实开心 时间(23min)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
int minPathSum(vector<vector<int> >& grid) {
int row = grid.size();
if(row == 0){
return 0;
}
int col = grid[0].size();
if(col == 0){
return 0;
}
int sum = 0;
// 单行 单列的情况
if(row == 1 || col == 1){
for(int i=0;i<row;++i){
for(int j=0; j<col;++j){
sum+=grid[i][j];
}
}
return sum;
}
// 多行多列的情况
// 为矩阵第一行赋值
for(int i=1;i<col;++i){
grid[0][i] += grid[0][i-1];
}
// 为矩阵的第一列赋值
for(int i=1;i<row;++i){
grid[i][0] += grid[i-1][0];
}
// DP 矩阵赋值 每一个格子的数取决的 其左边和上面的数中 较小的一个
for(int i=1; i<row;++i){
for(int j=1;j<col;++j){
grid[i][j] = min(grid[i][j-1], grid[i-1][j]) + grid[i][j];
}
}
return grid[row-1][col-1];
}
};
int main(){
Solution s;
vector<vector<int> > m({
{0,0,0},
{0,1,0},
{0,0,0}});
s.minPathSum(m);
return 0;
}