【算法|动态规划No.17】leetcode64. 最小路径和

个人主页:兜里有颗棉花糖
欢迎 点赞 收藏✨ 留言✉ 加关注本文由 兜里有颗棉花糖 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
希望我们一起努力、成长,共同进步。
在这里插入图片描述

点击直接跳转到该题目

目录

  • 1️⃣题目描述
  • 2️⃣题目解析
  • 3️⃣解题代码

1️⃣题目描述

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

明:每次只能向下或者向右移动一步。

示例1:

【算法|动态规划No.17】leetcode64. 最小路径和_第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;
    }
};

通过啦!!!
【算法|动态规划No.17】leetcode64. 最小路径和_第2张图片

你可能感兴趣的:(手撕算法系列专栏,LeetCode,算法,动态规划)