leetcode 64 最小路径和

一、题目描述

二、解题思路

整体思路

由题意可知,本次的选择基于前面的结果,所以可以使用动态规划来解决这个问题。

具体思路

(1)dp[i][j]的含义

dp[i][j]的值表示到(i,j)位置的最小路径和。

(2)初始化

由于只能向右和向下移动,所以可以将dp数组的第一列和第一行初始化:

<1>第一行只能由起点持续右移得到,所以dp[0][col]=dp[0][col-1]+grid[0][col];

<2>第一列只能由起点持续下移得到,所以dp[row][0]=dp[row-1][0]+grid[row][0];

(3)状态转移方程

中间的位置只能由其上面的位置下移或者左边的位置右移动得到,所以状态转移方程为:

dp[row][col]=grid[row][col]+min(dp[row-1][col],dp[row][col-1]);

三、代码实现

cpp 复制代码
class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        //动态规划
        int m=grid.size();
        int n=grid[0].size();
        if(m==0||n==0) return 0;
        vector<vector<int>> dp(m,vector<int>(n,0));

        //填写dp数组
        dp[0][0]=grid[0][0];
       //填写第一行
       for(int col=1;col!=n;col++) dp[0][col]=dp[0][col-1]+grid[0][col];
       //填写第一列
       for(int row=1;row!=m;row++) dp[row][0]=dp[row-1][0]+grid[row][0];
       //填写中间位置
       for(int row=1;row!=m;row++)
        for(int col=1;col!=n;col++)
            dp[row][col]=grid[row][col]+min(dp[row-1][col],dp[row][col-1]);

        return dp[m-1][n-1];
    }
};
相关推荐
carver w3 分钟前
说人话版 K-means 解析
算法·机器学习·kmeans
小O的算法实验室9 分钟前
2026年SEVC SCI2区,基于差分向量内学习策略的自适应指数交叉差分进化算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
天若有情67315 分钟前
我发明的PROTO_V4协议:一个让数据“穿上迷彩服”的发明(整数传输协议)
网络·c++·后端·安全·密码学·密码·数据
加油=^_^=17 分钟前
【C++11】特殊类设计 | 类型转换
c++·单例模式·类型转换
gloomyfish17 分钟前
【最新技术】多模态零样本工业缺陷检测概述
人工智能·算法·计算机视觉
渡过晚枫18 分钟前
[蓝桥杯/java/算法]攻击次数
java·算法·蓝桥杯
加成BUFF20 分钟前
C++入门详解2:数据类型、运算符与表达式
c语言·c++·计算机
风筝在晴天搁浅20 分钟前
hot100 3.无重复字符的最长子串
数据结构·算法·leetcode
徐行code22 分钟前
std::bind()和lambda的区别
c++
liuyao_xianhui22 分钟前
寻找旋转排序数组中的最小值_优选算法(二分算法)
算法