个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
点击直接跳转到该题目
目录
- 1️⃣题目描述
- 2️⃣题目解析
- 3️⃣解题代码
1️⃣题目描述
给定一个包含非负整数的 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] <= 200
2️⃣题目解析
状态表示:
- 到达(i,j)位置的最小路径和。
状态转移方程:
dp[i][j] = min(dp[i - 1][j] , dp[i][j - 1]) + grid[i - 1][j - 1];
返回值:
dp[m][n]
,注意,由于我这里多开辟了一行一列的空间,所以最后返回的是最后一个位置的dp值,即到达最后一个位置的最小路径和。
3️⃣解题代码
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(),n = grid[0].size();
int ret = 0;
vector<vector<int>> dp(m + 1,vector<int>(n + 1,INT_MAX));
for(int i = 1;i <= m;i++)
{
for(int j = 1;j <= n;j++)
{
if(i == 1 && j == 1) dp[i][j] = grid[0][0];
else dp[i][j] = min(dp[i][j - 1],dp[i - 1][j]) + grid[i - 1][j - 1];
}
}
ret = dp[m][n];
return ret;
}
};
通过啦!!!