leetcode64. 最小路径和(动态规划-java)

news2024/9/21 14:49:01

最小路径和

  • leetcode64. 最小路径和
    • 题目描述
  • 暴力递归 + 缓存
    • 代码演示
  • 动态规划
    • 代码演示
    • 空间压缩
      • 代码演示
  • 动态规划专题

leetcode64. 最小路径和

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-path-sum

题目描述

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。

示例1:
在这里插入图片描述
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:
输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 200

暴力递归 + 缓存

最小路径和的问题,是一类问题.我们是有两个方向,向下和向右,我们递归时,要去判断这两种结果下来,哪个路径和最小.
在图中要做好边界值判断.

代码演示

	/**
	* 最小路径和
	*/
    public int minPathSum(int[][] grid) {
        int n = grid.length;
        int m = grid[0].length;
        int[][]dp = new int[n][m];
        return process1(grid,0,0,dp);
    }

/**
* 暴力递归
* dp 缓存
* 
*/
 public int process1(int[][] grid,int i,int j,int[][]dp){
 		// 到右下角最后一个位置时, 结束,返回最右下角的值
          if(i == grid.length - 1  && j == grid[0].length - 1 ){
              return grid[i][j];
          }
          //一个方向上越界时, 返回一个无效值
          if( i >= grid.length || j >=  grid[0].length  ){
              return Integer.MAX_VALUE;
          }
          //缓存中如果有值的话,从缓存中拿
          if(dp[i][j] != 0){
              return dp[i][j];
          }
          //两个方向上比较的最小值,加上当前位置上的值,是最小值
          int res = Math.min(process1(grid,i + 1,j,dp) ,
                process1(grid,i,j + 1,dp)) + grid[i][j];
          //结果放进缓存中
          dp[i][j] = res ;
          return res;
    }

动态规划

动态规划就是对暴力递归的改写.三个步骤
1.初始化dp 表的值.
第一行的值,因为没有从上面方向的值,所以只能是从左往右相加
第一列的值,因为没有从右面方向的值,所以只能从上往下相加
2. 根据递归过程找出状态转移方程
dp[i][j] = Math.min(dp[i - 1][j],dp[i][j - 1]) + grid[i][j];
3.返回最右下角的值,

代码演示

 public int minPathSum(int[][] grid) {
        int n = grid.length;
        int m = grid[0].length;
        int[][]dp = new int[n + 1][m + 1];
         dp[0][0] = grid[0][0];
         //第一行的值,只能从左往右相加,没有上方的值
        for (int i = 1; i < m;i++){
            dp[0][i] = dp[0][i - 1] + grid[0][i] ;
        }
          //第一列的值,只能从上往下相加,没有左边的值
        for (int j = 1; j < n;j++){
           dp[j][0] = dp[j - 1][0] + grid[j][0];
        }

        for (int i = 1; i < n ;i++){
            for (int j = 1; j < m ;j++){
            //状态转移方程.
                dp[i][j] = Math.min(dp[i - 1][j],dp[i][j - 1]) + grid[i][j];
            }
        }
        return dp[n - 1][m - 1];
    }

空间压缩

状态转移方程是: dp[i][j] = Math.min(dp[i - 1][j],dp[i][j - 1]) + grid[i][j];
但是我们最后只要了 return dp[n - 1][m - 1] 最后一行的右下角的值,
所以我们可以用一行的的数据,不断滚动的向下更新,
用图演示
在这里插入图片描述
x位置的值依赖i- 1 和 j - 1 的值,我们就不需要二维数组了,我们用一个单数组,不断向下滚动更新,每次更新时,我们提前把j - 1 位置的数更新出来,然后从左向右更新值,

代码演示

     public int minPathSum(int[][] grid) {
        int n = grid.length;
        int m = grid[0].length;
        int[]dp = new int[m + 1];
        dp[0] = grid[0][0];
        for (int i = 1; i < m;i++){
            dp[i] = dp[i - 1] + grid[0][i] ;
        }

        for (int i = 1; i < n ;i++){
        //每次先把最左边的值更新出来下面在从左往右更新值
            dp[0] = dp[0] + grid[i][0];
            for (int j = 1; j < m ;j++){
                
                dp[j] = Math.min(dp[j - 1] ,dp[j]) + grid[i][j];
            }
        }
        return dp[m - 1];
    }

动态规划专题

leetcode416. 分割等和子集

leetcode354. 俄罗斯套娃信封问题

leetcode300. 最长递增子序列

leetcode213. 打家劫舍 II

leetcode198. 打家劫舍

leetcode337. 打家劫舍 III

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/675463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C高级6.23

一.整理用户相关的指令、整理磁盘相关的指令 用户相关的指令&#xff1a; 1.id -u 查看用户ID 2.id -g 查看组ID 3.whoami 查看用户名 4.sudo adduser 用户名 创建用户 5.给新用户添加sudo权限 给新用户添加sudo权限的步骤&a…

Spring 与 Servlet-1

整合 Spring 和 Servlet DAO 使用 JDBC 通过模板类进行整合&#xff0c;模板类由 Spring 框架提供&#xff0c;只需进行配置即可 1、依赖&#xff1a;spring-jdbc 和连接池 druid、数据库驱动 mysql-connect-java 2、引入了 IoC、DI 后对象的创建完全交给 Spring 负责&#…

chatgpt赋能python:求1-3+5-7:用Python解决这个算术问题

求1-35-7: 用Python解决这个算术问题 介绍 在Python编程领域中&#xff0c;算术问题是我们经常会遇到的。今天&#xff0c;我们将介绍如何用Python求1-35-7这个算式的结果。这个问题看起来很简单&#xff0c;但如果你是初学者&#xff0c;可能会有点难以理解。不必担心&#…

嵌入式中编写可移植 C/C++ 程序的要点方法

以前做过两年 C 程序移植工作&#xff0c;从 Win32 平台移植到 Linux 平台。大约有上百万行 C/C代码&#xff0c;历时一年多。 在开发 Win32 版本时&#xff0c;已经强调了程序的可植性&#xff0c;无奈 Win32 团队里对 Linux 精通的人比较少&#xff0c;很多问题没有想到&…

InstructGPT论文解读

介绍 上图可以看出InstructGPT(PPO-ptx)及变体&#xff08;variant trained without pretraining mix&#xff09;(PPO)显著优于GPT&#xff0c;1.3B的InstructGPT优于175B的GPT&#xff0c;SFT作为RLHF第一阶段的模型效果比GPT好。当然结果是由人来评价的。 RLHF包含三个步骤…

多EIP下的UDP通信异常分析

背景 SRE和程序在测试DDos多EIP防御方案的过程中&#xff0c;发现多EIP模式下, 监听的UDP端口连接会出现客户端访问异常。 表现为客户端发送一次数据后服务端这边主动断开了&#xff0c;或是客户端和服务端同时断开。 该问题会导致业务在多EIP方案下无法达到预期效果&#xff0…

【Visual Studio】Qt 获取系统时间,并实时更新时间,使用 C++ 语言,配合 Qt 开发串口通信界面

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 这个需求来源于这个工程&#xff1a;【Visual Studio】Qt 的实时绘图曲线功能&#xff0c;使用 C 语言&#xff0c;配合 Qt 开发串口通信界面。 文章目录 Qt…

chatgpt赋能python:Python求和1-100的方法

Python求和1-100的方法 Python语言简介 Python是一个广泛使用的高级编程语言&#xff0c;其设计哲学强调代码可读性和语法简洁性。Python语言作为一门多范式的编程语言&#xff0c;支持对象、函数式和结构化编程等多种形式。Python应用领域广泛&#xff0c;如机器学习、桌面应…

chatgpt赋能python:Python求1!:介绍

Python求1!&#xff1a;介绍 在Python编程中&#xff0c;阶乘是一个常见的数学运算。阶乘指定的数的所有小于或等于其本身的正整数之积&#xff0c;例如&#xff0c;1!等于1&#xff0c;2&#xff01;等于2乘以1&#xff0c;3!等于3乘以2乘以1&#xff0c;以此类推。 在这篇文…

【工程项目管理】工程项目管理实践报告

前言&#xff1a; 1.大学课程的大作业&#xff0c;觉得存起来也没什么用就干脆发出来了。。。 2.很可能有不严谨之处&#xff0c;各位看官如若发现欢迎指出~ 创作者文章管理系统 1 实践环节作业1&#xff1a;选题及任务分解WBS &#xff08;1&#xff09;选题 a.项目名称&a…

【1 beego学习 -MAC框架与ORM数据库】

0 beego的启动流程 1 入口 package mainimport ( //全局使用的路由和models_ "studyDemo/models"_ "studyDemo/routers"beego "github.com/beego/beego/v2/server/web" )func main() {beego.Run() }2 根据请求路由加载对应的控制器 package r…

【计算机组成原理】微程序控制器

目录 一、微程序控制器概述 二、微程序控制器设计方法 三、微指令执行过程 四、控制字段的编码方式 五、下址字段的设计方法 六、微程序入口地址的产生方法 一、微程序控制器概述 微程序&#xff1a;微指令构成的有序集合&#xff0c;一条指令对应一段微程序 微指令&…

【小沐学Android】Material Design设计规范之颜色篇

文章目录 1、简介1.1 Android1.2 Material Design 2、Material Design 12.1 材料设计2.2 颜色 3、Material Design 23.1 材料系统3.2 颜色 4、Material Design 34.1 颜色样式4.2 配色方案4.3 Material Theme Builder 结语 1、简介 1.1 Android 谷歌在2007年发布了第一个测试版…

chatgpt赋能python:Python清除代码:让你的项目更加优美

Python清除代码&#xff1a;让你的项目更加优美 随着时间推移和项目规模扩大&#xff0c;代码中可能会出现许多冗余、无用或重复的代码。这不仅会让代码难以维护&#xff0c;还会降低代码的性能和可读性。而Python作为一种高级编程语言&#xff0c;提供了许多工具和技术来清除…

牛客练习赛108 E.琉焰(非树边性质/线段树分治+可撤销并查集 or LCT)

题目 思路来源 官方题解 题解 针对每个连通块&#xff0c;单独考虑&#xff1a; 一方面&#xff0c; 任取连通块的某棵生成树&#xff0c; 对于任意非树边(u,v)&#xff0c;把树边u到v上的所有边都选中&#xff0c;即被覆盖1次&#xff0c; 任取某个非树边集合S&#xff…

LangChain for LLM Application Development 基于LangChain开发大语言应用模型(下)

以下内容均整理来自deeplearning.ai的同名课程 Location 课程访问地址 DLAI - Learning Platform Beta (deeplearning.ai) LangChain for LLM Application Development 基于LangChain开发大语言应用模型&#xff08;上&#xff09; 一、LangChain: Q&A over Documents基于文…

bert4rec简介

1、bert4rec提出动机 用户行为动态变化&#xff0c;序列行为建模取得了不错的效果 单向结构限制了行为序列中隐藏信息的挖掘 序列神经网络顺序依赖&#xff0c;无法并行计算 为此&#xff0c;提出了 基于双向self-attention和Cloze task的用户行为序列建模方法。据我们所知…

解决Jenkins报错

解决Jenkins报错 1 linux空间不够问题1.1 报错现象1.2 定位问题1.3 解决措施 2 bash问题2.1 问题现象2.2 问题定位2.3 解决措施 3 虚拟环境问题3.1 问题现象3.2 问题定位3.3 解决措施 4 jenkins构建完成但一直转圈问题4.1 问题现象4.2 问题定位4.3 解决措施 5 jenkins自动化部署…

C高级6.24

一、整理grep、find、cut、tar、apt-get、dpkg、ln、ln-s指令 1.grep ----->查找字符串 grep 字符串 文件名 -w:按单词查找 -R:实现递归查找&#xff0c;主要用于路径是目录的情况 -i:不区分大小写 -n:显示行号 grep -w "^ubuntu" /etc/passwd ---->查找以ub…

【深度学习】RepVGG解析和学习体会

文章目录 前言0. Vgg1.RepVGG Block 详解 前言 论文名称&#xff1a;RepVGG: Making VGG-style ConvNets Great Again 论文下载地址&#xff1a;https://arxiv.org/abs/2101.03697 官方源码&#xff08;Pytorch实现&#xff09;&#xff1a;https://github.com/DingXiaoH/RepV…