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数组,dpij表示左上角开始到第(i, j)位置的最优路径的数字和。因为每次只能向下或向右移动,我们可以得到状态转移方程为dpij = min(doi-1j, dpij-1 + gridij)。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;
}
相关推荐
To_OC4 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495645 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
爱刷碗的苏泓舒9 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽12 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米12 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
REST_302712 小时前
告别Excel孤岛:一款任务链路可视化工具带来的真实改变
大数据·微服务·云计算·编辑器·excel·动态规划
星空露珠12 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA14 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel14 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构