动态规划问题——矩阵的最小路径和

news2024/10/2 22:16:50

题目:

给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和。

示例:

给定的m如下:

1        3        5        9

8              3        4 

5        0        6        1

8        8        4        0

红色1 3 1 0 6 1 0为最短路径,和为12。 

分析:

最后求得的矩阵 dp 如下:

1        4        9        18

9        5        18      12

14      5        11      12

22      13      15      12

 代码实现:

    public static int minPathSum1(int[][] m) {
        //如果矩阵为空 或者行数为0 列数为0
        if (m == null || m.length == 0 || m[0] == null || m[0].length == 0) {
            return 0;
        }
        int row = m.length;//行数
        int col = m[0].length; //列数
        int[][] dp = new int[row][col];//初始化dp矩阵
        dp[0][0] = m[0][0];
        //for循环得到dp矩阵第一列的值
        for (int i = 1; i < row; i++) {
            dp[i][0] = dp[i -1][0] + m[i][0];
        }
        //for循环得到dp矩阵第一行的值
        for (int j = 1; j < col; j++) {
            dp[0][j] = dp[0][j-1] + m[0][j];
        }
        //for循环得到其他位置的最短路径和
        for (int i = 1; i < row; i++) {
            for (int j = 1; j < col; j++) {
                dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + m[i][j];
            }
        }
        return dp[row-1][col-1];
    }

进行空间压缩:

使用一个arr数组,不断滚动,最开始是[0,0,0,0],然后变成dp矩阵第一行、dp矩阵第二行、最后变成dp矩阵的最后一行

  代码实现:

    public static int minPathSum2(int[][] m) {
        if (m == null || m.length == 0 || m[0] == null || m[0].length == 0) {
            return 0;
        }
        //得到行数和列数 more是大的数 less是小的数
        int more = Math.max(m.length, m[0].length);
        int less = Math.min(m.length, m[0].length);
        //行数是不是大于或等于列数
        // 比如4行3列,那么more=4,m.length=4,4==4,返回true,说明行数大于等于列数
        // 比如3行4列,那么more=4,m.length=3,4!=3,返回false,说明行数不大于等于列数
        boolean rowmore = more == m.length;
        int[] arr = new int[less];
        arr[0] = m[0][0];
        //根据rowmore的值来决定按dp矩阵的行往下滚还是按列往下滚
        for (int i = 1; i < less; i++) {
            arr[i] = arr[i-1] + (rowmore ? m[0][i] : m[i][0]);
        }
        //开始往下滚
        for (int i = 1; i < more; i++) {
            //arr[0] = arr[0](上一个arr[0]) + m[i][0];  按行滚
            //或者 arr[0] = arr[0](上一个arr[0]) + m[0][i];  按列滚
            arr[0] = arr[0] + (rowmore ? m[i][0] : m[0][i]);
            //开始求 arr[1],arr[2]...
            for (int j = 1; j < less; j++) {
                arr[j] = Math.min(arr[j-1],arr[j]) + (rowmore ? m[i][j] : m[j][i]);
            }
        }
        return arr[less-1];
    }

对于第一个for循环:

对于第二个for循环(外层和内层)

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

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

相关文章

灌区信息化管理系统解决方案 灌区用水量测系统介绍

平升电子灌区信息化管理系统解决方案/灌区用水量测系统&#xff0c;对灌区的渠道水位、流量、水雨情、土壤墒情、气象等信息进行监测&#xff0c;同时对泵站、闸门进行远程控制&#xff0c;对重点区域进行视频监控&#xff0c;实现了信息的采集、统计、分析、控制等功能&#x…

我国均温板行业发展趋势:5G手机领域需求强劲 今年市场空间或超15亿

均温板&#xff08;VaporChamber&#xff09;技术从原理上类似于热管&#xff0c;但在传导方式上有所区别。热管为一维线性热传导&#xff0c;而真空腔均热板中的热量则是在一个二维的面上传导&#xff0c;因此效率更高。具体来说&#xff0c;真空腔底部的液体在吸收芯片热量后…

【图像去噪】非局部均值(NLM)滤波图像去噪【含Matlab源码 420期】

⛄一、图像去噪及滤波简介 1 图像去噪 1.1 图像噪声定义 噪声是干扰图像视觉效果的重要因素&#xff0c;图像去噪是指减少图像中噪声的过程。噪声分类有三种&#xff1a;加性噪声&#xff0c;乘性噪声和量化噪声。我们用f(x,y&#xff09;表示图像&#xff0c;g(x,y&#xff0…

Spring Cloud Alibaba Sentinel - - > 容错机制

文章目录Sentinel 的作用分布式微服务系统遇到的问题导致服务不可用的原因&#xff1a;Sentinel - - > 容错机制参考&#xff1a;Sentinel 的作用 Sentinel 主要用来解决微服务架构中出现的一些可用性问题&#xff0c;从而实现系统的高可用。系统在运行过程中不可能不出现问…

单例模式的创建(饿汉模式懒汉模式)

目录 一.什么是单例模式 二.用static来创建单例模式 三.饿汉模式与懒汉模式 四.饿汉模式与懒汉模式的线程安全问题 五.New引发的指令重排序问题 六.小结 一.什么是单例模式 单例模式就是指某个类有且只有一个实例(instance) 这个是由需求决定的,有些需求场景就要求实例不…

关于mysql学习

1.索引 1.1 索引概述 Mysql官方对索引的定义是&#xff1a;索引(index)是帮助mysql高效获取数据的数据结构(有序)。在数据库之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某些方式引用(指向)数据&#xff0c;这样就可以在数据结构…

密码技术扫盲:对称加密

个人博客 &#x1f3af; 密码技术扫盲&#xff1a;对称加密密码技术扫盲&#xff1a;非对称加密密码技术扫盲&#xff1a;认证 人类最较真、技艺最精湛的事业是军事&#xff0c;密码技术最大放异彩的地方也在军事&#xff0c;战争中需要通过无线电或其他手段来传达指令&#…

LeetCode刷题复盘笔记—一文搞懂动态规划之309. 最佳买卖股票时机含冷冻期问题(动态规划系列第二十四篇)

今日主要总结一下动态规划的一道题目&#xff0c;309. 最佳买卖股票时机含冷冻期 题目&#xff1a;309. 最佳买卖股票时机含冷冻期 Leetcode题目地址 题目描述&#xff1a; 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算…

Python编程 函数的定义与参数

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.函数 1.函数例子 不会让代码重复的出现。CVout 2.函数介绍(熟悉) 3.…

如何在AdsPower中设置Oxylabs住宅代理和数据中心代理?

AdsPower是一款适用于Windows和Mac系统的浏览器管理工具&#xff0c;允许多用户登录。AdsPower的主要功能有多账户管理、浏览器指纹处理等。 集成操作流程 在官网&#xff08;www.adspower.com/download&#xff09;下载AdsPower并完成安装工作后&#xff0c;单击新建配置文件…

分布式文件系统之NFS

「分布式」是现在蛮流行的一个词&#xff0c;而其盛行&#xff0c;离不开底层网络通信能力的迅速发展。在文件系统这个领域&#xff0c;早期的分布式实现更多的是用来实现「共享」&#xff0c;而不是「容错」。传统的集中式文件系统允许单个系统中的多用户共享本地存储的文件&a…

SVG公众号排版 | GIF动图如何禁止循环播放?PS设置了也没用!

在SVG公众号排版中,我们经常使用到GIF动图,有些排版需求是想让GIF动图一直无限循环播放,也有其他排版需求是只想让GIF动图播放一次就停止了,这种情况我们可以通过Photoshop软件来设置GIF动图的播放次数,详见下图。 但是呢,也有一种情况,即使在Photoshop软件设置了GIF动图…

大话设计模型 Task02:策略、装饰、代理

目录一、简单工厂模式问题描述模式定义问题分析代码实现二、策略模式问题描述问题分析模式定义代码实现三、装饰模式问题描述问题分析模式定义代码实现四、代理模式问题描述问题分析模式定义代码实现五、工厂方法模式问题描述问题分析模式定义简单工厂 vs. 工厂方法代码实现一、…

上传项目代码到Github|Gitee

上传项目代码到Github|Gitee 文章目录上传项目代码到Github|Gitee1、前置准备1.1 Git 安装1.2 在 Git 中设置用户名1.2.1 为计算机上的每个存储库设置 Git 用户名1.2.2 为一个仓库设置 Git 用户名1.3 SSH免密登录1.4 Github创建一个新的仓库2、上传项目2.1 初始化本地库2.2 添加…

蓝桥杯入门即劝退(十六)查找元素范围(双解法)

欢迎关注点赞评论&#xff0c;共同学习&#xff0c;共同进步&#xff01; ------持续更新蓝桥杯入门系列算法实例-------- 如果你也喜欢Java和算法&#xff0c;欢迎订阅专栏共同学习交流&#xff01; 你的点赞、关注、评论、是我创作的动力&#xff01; -------希望我的文章…

什么是制造业数字化转型?制造业数字化转型的核心与意义

对于生产制造企业来讲&#xff0c;当下如果不进行数字化转型的话&#xff0c;很大概率会被时代所抛弃的。为什么这么讲&#xff1f;因为在未来的很长一段时间&#xff0c;你可以充分了解到&#xff0c;数字化转型已然成为了制造业向前的主旋律。既然数字化势在必行&#xff0c;…

可以赚钱的副业项目,简单易上手兼职副业推荐

在当前的经济环境下&#xff0c;对每个人来说&#xff0c;仅仅依靠那点薪水生活是非常紧张的。为了改善你的生活&#xff0c;你需要找到其他赚钱的方法&#xff0c;在互联网上做兼职是一个不错的选择。 今天推荐几个普通人可以做的兼职副业&#xff0c;希望对大家有所帮助。 一…

微信公众号的文章可以修改几次?修改的步骤有哪些

许多小伙伴们在运营微信公众号的时候&#xff0c;可能会遇到过这些难题&#xff0c;在发布微信公众号之前检查没有检查好&#xff0c;导致有错字或者是错句。有的时候可能配图还会配错&#xff01; 今天伯乐网络传媒就给大家带来一些实用的东西&#xff0c;比如微信公众号可以…

深入理解 Python 的对象拷贝和内存布局

深入理解 Python 的对象拷贝和内存布局 前言 在本篇文章当中主要给大家介绍 python 当中的拷贝问题&#xff0c;话不多说我们直接看代码&#xff0c;你知道下面一些程序片段的输出结果吗&#xff1f; a [1, 2, 3, 4] b a print(f"{a } \t|\t {b }") a[0] 100…

微信小程序的自定义组件(1)

文章目录1. 自定义组件2. 组件样式3. 组件-数据、方法和属性4. 组件数据监听器5. 组件纯数据字段1. 自定义组件 Component(Object object) | 微信开放文档 (qq.com) 创建组件 在项目的根目录中&#xff0c;鼠标右键&#xff0c;创建components->test文件夹在新建的componen…