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];
    }
};
相关推荐
Elias不吃糖4 小时前
LeetCode每日一练(209, 167)
数据结构·c++·算法·leetcode
Want5954 小时前
C/C++跳动的爱心②
c语言·开发语言·c++
初晴や4 小时前
指针函数:从入门到精通
开发语言·c++
铁手飞鹰5 小时前
单链表(C语言,手撕)
数据结构·c++·算法·c·单链表
悦悦子a啊5 小时前
项目案例作业(选做):使用文件改造已有信息系统
java·开发语言·算法
小殊小殊5 小时前
【论文笔记】知识蒸馏的全面综述
人工智能·算法·机器学习
无限进步_5 小时前
C语言动态内存管理:掌握malloc、calloc、realloc和free的实战应用
c语言·开发语言·c++·git·算法·github·visual studio
im_AMBER5 小时前
AI井字棋项目开发笔记
前端·笔记·学习·算法
Wadli5 小时前
项目2 |内存池1|基于哈希桶的多种定长内存池
算法
渡我白衣5 小时前
五种IO模型与非阻塞IO
运维·服务器·网络·c++·网络协议·tcp/ip·信息与通信