Minimum Path Sum 基本动态规划:二维--力扣101算法题解笔记

7.3Minimum Path Sum 基本动态规划:二维

题目描述

给定一个m*n大小的非负整数矩阵,求从左上角开始到右下角结束的、经过的数字的和最小的路径。每次只能向右或向下移动

输入输出样例

Input :

\[1, 3, 1\], \[1, 5, 1\], \[4, 2, 1\]

Output:7

也就是说1-3-1-1-1,一共是7

题解

这个也是要利用题目的逻辑转换成数组、进而转换成状态方程,然后用算法求解

先定义一个同样是二维的dp数组,dp[i][j]表示左上角开始到第(i, j)位置的最优路径的数字和。因为每次只能向下或向右移动,我们可以得到状态转移方程为dp[i][j] = min(do[i-1][j], dp[i][j-1] + grid[i][j])。grid为原数组

转换为算法的代码如下:

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

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

int main() {
    vector<vector<int>> grid = { {1,3,1},{1,5,1},{4,2,1} };
    cout << minPathSum(grid) << endl;
    return 0;
}
相关推荐
啊哦呃咦唔鱼1 天前
LeetCode hot100-15 三数之和
数据结构·算法·leetcode
_日拱一卒1 天前
LeetCode(力扣):杨辉三角||
算法·leetcode·职场和发展
rqtz1 天前
基于I2C总线的IMU-磁力计融合算法与数据共享
算法·iic·espidf·qmc5883p·icm42670p·imu磁力计融合
leluckys1 天前
算法-链表-二、成对交换两个节点
数据结构·算法·链表
小糯米6011 天前
C++ 排序
c++·算法·排序算法
未来之窗软件服务1 天前
幽冥大陆(一百12)js打造json硬件管道——东方仙盟筑基期
开发语言·javascript·算法·json·仙盟创梦ide·东方仙盟·东方仙盟算法
放下华子我只抽RuiKe51 天前
AI大模型开发-实战精讲:从零构建 RFM 会员价值模型(进阶挑战版)
人工智能·深度学习·算法·机器学习·数据挖掘·数据分析·聚类
Nontee1 天前
Leetcode Top100答案和解释 -- Python版本(链表)
算法·leetcode·链表
niuniudengdeng1 天前
六面独立转动魔方还原机器人设计与实现
数学·算法·机器人