【学会动态规划】最小路径和(9)

简介: 【学会动态规划】最小路径和(9)

动态规划怎么学?

学习一个算法没有捷径,更何况是学习动态规划,

跟我一起刷动态规划算法题,一起学会动态规划!

1. 题目解析

题目链接:64. 最小路径和 - 力扣(Leetcode)

这道题目不难理解,就是从右上角开始,

只能往右或者往下走,计算走到右下角的最小路径和即可。

2. 算法原理

1. 状态表示

dp[ i ][ j ] 就表示从起点到 [ i,j ] 位置的最小路径和。

2. 状态转移方程

根据最近的一步划分问题,而到 [ i,j ] 位置有两种情况,

一个是从上面来:dp[ i - 1 ][ j ] + g[ i ][ j ]

一个是从左边来:dp[ i ][ j - 1 ] + g[ i ][ j ]

而我们要求的是最小路径和,所以状态转移方程就是:

dp[ i ][ j ] = min( dp[ i - 1 ][ j ],dp[ i ][ j - 1 ] ) + g[ i ][ j ]

3. 初始化

初始化是为了防止越界,所以我们只需要多加上面一行和左边一行即可,

不过里面填的值要保证不影响后面的填表,所以我们可以将整个表初始化成正无穷大,

然后为了让第一次填表不出问题,就把第一个位置上面的位置初始化成0即可。

4. 填表顺序

从上往下,从左往右

5. 返回值

返回右下角的最小路径和即可。

3. 代码编写

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));
        dp[0][1] = 0;
        for(int i = 1; i <= m; i++) {
            for(int j = 1; j <= n; j++) {
                dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
            }
        }
        return dp[m][n];
    }
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

相关文章
|
7月前
|
消息中间件 Kubernetes NoSQL
动态规划-状态压缩、树形DP问题总结
动态规划-状态压缩、树形DP问题总结
|
2月前
|
存储
【动态规划】子数组系列
本文介绍了多个动态规划问题及其解决方案,包括最大子数组和、环形子数组的最大和、乘积最大子数组、乘积为正数的最长子数组长度、等差数列划分、最长湍流子数组、单词拆分及环绕字符串中唯一的子字符串。通过详细的状态定义、转移方程和代码实现,帮助读者理解每类问题的核心思路与解题技巧。
58 2
|
7月前
|
算法
动态规划—(背包问题)
动态规划—(背包问题)
|
7月前
|
消息中间件 Kubernetes NoSQL
动态规划- 背包问题总结(一)
动态规划- 背包问题总结(一)
|
7月前
|
消息中间件 Kubernetes NoSQL
动态规划- 背包问题总结(二)
动态规划- 背包问题总结(二)
动态规划:完全背包问题
动态规划:完全背包问题
78 0
|
机器学习/深度学习
动态规划-背包问题
动态规划-背包问题
动态规划-完全背包
前言 我们上篇文章学习了动态规划01背包的问题,本篇文章我们继续学习完全背包。大家可以在学习完01背包的基础上再进行学习,比较其两者的解题差异。