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;
}
相关推荐
CoderCodingNo2 小时前
【NOIP】2011真题解析 luogu-P1003 铺地毯 | GESP三、四级以上可练习
算法
iFlyCai3 小时前
C语言中的指针
c语言·数据结构·算法
查古穆3 小时前
栈-有效的括号
java·数据结构·算法
再一次等风来3 小时前
近场声全息(NAH)仿真实现:从阵列实值信号到波数域重建
算法·matlab·信号处理·近场声全息·nah
汀、人工智能3 小时前
16 - 高级特性
数据结构·算法·数据库架构·图论·16 - 高级特性
大熊背3 小时前
利用ISP离线模式进行分块LSC校正的方法
人工智能·算法·机器学习
XWalnut3 小时前
LeetCode刷题 day4
算法·leetcode·职场和发展
蒸汽求职4 小时前
机器人软件工程(Robotics SDE):特斯拉Optimus落地引发的嵌入式C++与感知算法人才抢夺战
大数据·c++·算法·职场和发展·机器人·求职招聘·ai-native
AI成长日志4 小时前
【笔面试算法学习专栏】双指针专题·简单难度两题精讲:167.两数之和II、283.移动零
学习·算法·面试
旖-旎4 小时前
分治(库存管理|||)(4)
c++·算法·leetcode·排序算法·快速选择算法