题目描述:
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
示例 2:
输入:grid = [[1,2,3],[4,5,6]]
输出:12
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100
思路:
这是一道简单的动态规划题,根据题意知,路径只能向下或者向右,所以可得:
1、对于第一行和第一列的元素,只有一种方式到达,所以从第0个开始累加即可
2、其他位置上的元素,可以从其上边或者左边到达,取两个的最小值,然后加上当前位置元素的值即可
3、综上得:
当 i > 0 i>0 i>0 且 j = 0 j=0 j=0 时, d p [ i ] [ 0 ] = d p [ i − 1 ] [ 0 ] + g r i d [ i ] [ 0 ] dp[i][0]=dp[i-1][0]+grid[i][0] dp[i][0]=dp[i−1][0]+grid[i][0]
当 i = 0 i=0 i=0 且 j > 0 j>0 j>0 时, d p [ 0 ] [ j ] = d p [ 0 ] [ j − 1 ] + g r i d [ 0 ] [ j ] dp[0][j]=dp[0][j-1]+grid[0][j] dp[0][j]=dp[0][j−1]+grid[0][j]
当
i
>
0
i>0
i>0 且
j
>
0
j>0
j>0 时,
d
p
[
i
]
[
j
]
=
m
i
n
(
d
p
[
i
−
1
]
[
j
]
+
d
p
[
i
]
[
j
−
1
]
)
+
g
r
i
d
[
i
]
[
j
]
dp[i][j]=min(dp[i-1][j]+dp[i][j-1])+grid[i][j]
dp[i][j]=min(dp[i−1][j]+dp[i][j−1])+grid[i][j]
代码:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int dp[grid.size()][grid[0].size()];
dp[0][0] = grid[0][0];
for (int i = 1; i < grid.size(); i++) {
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
for (int i = 1; i < grid[0].size(); i++) {
dp[0][i] = dp[0][i - 1] + grid[0][i];
}
for (int i = 1; i < grid.size(); i++) {
for (int j = 1; j < grid[0].size(); j++) {
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[grid.size()-1][grid[0].size()-1];
}
};