一、题目
题目描述
给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。
示例1
输入
[[1,3,5,9],[8,1,3,4],[5,0,6,1],[8,8,4,0]]
返回值
12
备注:
1≤n,m≤2000
1 \leq arr_{i,j} \leq 1001≤arr
i,j
≤100
二、思路
1、运用动态规划解决,最后一步为比较前面一个的大小,再加上最后一个
2、每一小步为前面一个的大小,取小的再加上当前的一个,然后存到数组里,刚开始把第一行和第一列添加进去
三、代码
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
if(grid.empty()){
return 0;
}
int rows=grid.size();
int cols=grid[0].size();
vector<vector<int>>dp(rows,vector<int>(cols,0));
dp[0][0]=grid[0][0];
for(int i=1;i<rows;++i){
dp[i][0]=dp[i-1][0]+grid[i][0];
}
for(int i=1;i<cols;++i){
dp[0][i]=dp[0][i-1]+grid[0][i];
}
for(int i=1;i<rows;++i){
for(int j=1;j<cols;++j){
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];
}
}
return dp[rows-1][cols-1];
}
};