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;
}
相关推荐
yu85939586 小时前
利用MATLAB进行木材图像去噪
开发语言·算法·matlab
cpp_25016 小时前
P2722 [USACO3.1] 总分 Score Inflation
数据结构·c++·算法·动态规划·题解·洛谷·背包dp
民乐团扒谱机6 小时前
【源码剖析】MATLAB混响函数底层逻辑拆解:Dattorro算法从公式到音频帧的完整推导
算法
淡海水6 小时前
【AI模型】概念-Token
人工智能·算法
凯瑟琳.奥古斯特6 小时前
数据结构核心知识点精要
数据结构·算法·排序算法
隔壁大炮6 小时前
Day02-04.张量点乘和矩阵乘法
人工智能·pytorch·深度学习·线性代数·算法·矩阵
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【删数问题】:删数问题
c++·算法·贪心·csp·信奥赛
geneculture6 小时前
本真信息观:基于序位守恒的融智学理论框架——人类认知第二次大飞跃的基础
人工智能·算法·机器学习·数据挖掘·融智学的重要应用·哲学与科学统一性·融智时代(杂志)
kronos.荒6 小时前
动态规划——最长递增子序列系列问题(python)
算法·动态规划·最长递增子序列系列问题
生信研究猿7 小时前
#P4625.第2题-大模型训练显存优化算法
算法