利用BFS或动态规划解决路径算法问题

news2024/10/5 15:07:42

最小路径和和不同路径

  • 一、力扣64. 最小路径和
    • 1.找出DP状态
    • 2.找出DP状态转移方程
    • 3. 算法实现
  • 二、力扣62. 不同路径
    • 思路1:BFS实现
    • 思路2:动态规划

一、力扣64. 最小路径和

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。
在这里插入图片描述
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

1.找出DP状态

此题需要求出从左上角出发,到达坐标(m,n)的路径数字和最小值。因此不难想到,子问题就是从左上角出发,到达坐标(i,j)的路径数字和最小值。

令 f[i][j]表示从左上角到坐标(i,j)的路径数字和最小值,原问题即可被划分为多个求最优值的子问题,且由于每次只能向下或向右移动一步,因此 f[i][j]的取值由f[i-1][j]和f[i][j-1]的值决定

进一步验证,可以发现, f[i][j] 的取值与f[i-1][j]和f[i][j-1]所对应的具体路径无关。

2.找出DP状态转移方程

确定完「DP 状态」后,继续确定「DP 转移方程」。

dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]

这里需要注意边界问题,比如第一行和第一列,只能向下或者向右运动。

3. 算法实现

// 利用动态规划
    /**
     * 从左上角出发,到达坐标(i,j)的路径数字和最小值。
     * 令 f[i][j]表示从左上角到坐标(i,j)的路径数字和最小值,原问题即可被划分为多个求最优值的子问题,
     * 且由于每次只能向下或向右移动一步,因此 f[i][j]的取值由f[i-1][j]和f[i][j-1]的值决定,即符合「最优子结构原则」。
     * 进一步验证,可以发现, f[i][j] 的取值与f[i-1][j]和f[i][j-1]所对应的具体路径无关,因此符合「无后效性」。
     * 则dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
     * 这里需要注意边界问题,比如第一行和第一列,只能向下或者向右运动。
     *
     * @param grid
     * @return
     */
    public static int minPathSum(int[][] grid) {
        // 判断数据是否为空
        if(grid==null||grid.length==0||grid[0].length==0){
            return 0;
        }
        // 行
        int rows = grid.length;
        // 列
        int cols = grid[0].length;
        int[][] dp = new int[rows][cols];
        // 左上角元素值
        dp[0][0] = grid[0][0];
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if(i==0 &&j==0){
                    continue;
                }
                if(i!=0&&j==0){
                    // 第1列
                    dp[i][0] = dp[i-1][0]+grid[i][0];
                }else if(i==0&&j!=0){
                    // 第一行
                    dp[0][j] = dp[0][j-1]+grid[0][j];
                }else{
                    // 找出向下或向右的最小值+当前值
                    dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
                }
            }
        }
        return dp[rows-1][cols-1];
    }

二、力扣62. 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?
在这里插入图片描述
输入:m = 3, n = 7
输出:28
示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右 -> 向下 -> 向下
  2. 向下 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向下

思路1:BFS实现

    // 利用BFS实现
    public static int uniquePaths(int m, int n) {
        // 存储向右和向下两个方向
        int[][] directions = {{1, 0}, {0, 1}};
        Queue<int[]> queue = new LinkedList<>();
        // 将初始坐标加入队列
        queue.add(new int[]{0, 0});
        // 不同路径数量
        int count = 0;
        while (!queue.isEmpty()) {
            // 取出队首坐标
            int[] curr = queue.poll();
            // 坐标到达终点
            if (curr[0] == m - 1 && curr[1] == n - 1) {
                count++;
            } else {
                for (int[] direction : directions) {
                    // 遍历2个方向
                    int x = curr[0] + direction[0];
                    int y = curr[1] + direction[1];
                    if (x >= 0 && x < m && y >= 0 && y < n) {
                        // 坐标未越界,则将新坐标加入队列
                        queue.add(new int[]{x, y});
                    }
                }
            }
        }
        return count;
    }

思路2:动态规划

    // 利用动态规划实现
    public static int uniquePaths(int m, int n) {
        // 思路:由于在每个位置只能向下或者向右, 所以每个坐标的路径和等于上一行相同位置和上一列相同位置不同路径的总和,
        // 状态转移方程:f[i][j] = f[i - 1][j] + f[i][j - 1];
        int[][] dp = new int[m][n];
        for (int i = 0; i < m; i++) {
            // 第i行,第0列,路径都是1
            dp[i][0] = 1;
        }
        for (int i = 0; i < n; i++) {
            // 第0行

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

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

相关文章

浅谈如何在linux上部署java环境

文章目录 一、部署环境1.1、JDK1.2、Tomcat1.3、MySQL 二、将自己写的的程序部署到云服务器上 一、部署环境 为了在linux上部署 Java web 程序&#xff0c;需要安装一下环境。 1.1、JDK 直接使用 yum 命令安装 openjdk。我们 windows系统上 下载的是 oracle 官方的 jdk。而 …

Redisson框架

1. Redisson锁与Redis订阅与发布模式的联系&#xff1a; Redisson锁中&#xff0c;使用订阅发布模式去通知等待锁的客户端&#xff1a;锁已经释放&#xff0c;可以进行抢锁。 publish channel_name message&#xff1a;将消息发送到指定频道 解锁时&#xff0c;在Lua解锁脚本…

vue开发网站--关于window.print()调取打印

1.vue点击按钮调取打印 点击按钮&#xff1a; 调取打印该页面&#xff1a; <div click"clickDown()">下载</div>methods: {//下载-调取打印clickDown() {window.print()}, }<style>/* 点击打印的样式 */media print {.clickDown {display: no…

昇思25天学习打卡营第七天|模型训练

背景 提供免费算力支持&#xff0c;有交流群有值班教师答疑的华为昇思训练营进入第七天了。 今天是第七天&#xff0c;前六天的学习内容可以看链接 昇思25天学习打卡营第一天|快速入门 昇思25天学习打卡营第二天|张量 Tensor 昇思25天学习打卡营第三天|数据集Dataset 昇思25天…

Altair SimSolid无网格快速结构仿真软件

Altair SimSolid软件作为一款快速无网格划分工具&#xff0c;凭借其独特的算法和计算能力&#xff0c;简化了工程师和分析师在进行复杂结构分析时的操作。它不仅提高了分析效率&#xff0c;降低了出错的可能性&#xff0c;还为用户提供了丰富的分析功能和直观易用的操作体验。在…

3、Redis集群原理分析

槽定位 (Slot Mapping): Redis Cluster 将所有数据划分为 16384 个槽位&#xff08;slots&#xff09;&#xff0c;每个槽位由一个或多个节点负责管理。Redis 集群通过 CRC16 哈希算法来计算每个 key 的哈希值&#xff0c;并对 16384 取模以确定该 key 应该存储在哪个槽位上。…

名企面试必问30题(十)——你有自己的方法论吗?

1.思路 第一&#xff0c;方法论指的是做某些事情或业务的套路&#xff0c;但它没有绝对的正确性&#xff0c;每个人都可以拥有专属的方法论。 第二&#xff0c;方法论必定源自于自身实战经验的总结。 2.参考解答 “在软件测试工作中&#xff0c;我逐渐形成了自己的一套方法论。…

Elasticsearch 聚合查询简介

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

技术赋能教育:校园3D电子地图与AR导航解决方案

随着高考的落幕&#xff0c;又一批新鲜血液即将注入大学校园。面对陌生的环境&#xff0c;如何快速适应、准确找到目标地点&#xff0c;成为新生们的一大难题。同时&#xff0c;对于学校而言&#xff0c;如何向报考人员直观展示校园环境&#xff0c;提供沉浸式参观体验&#xf…

VMware ESXi 8.0U3 macOS Unlocker OEM BIOS 集成驱动版,新增 12 款 I219 网卡驱动

VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 集成驱动版&#xff0c;新增 12 款 I219 网卡驱动 VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U3 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访…

kaggel-汽车价格预测项目

1.读取数据&#xff0c;查看数据基本概况 import pandas as pd datapd.read_csv(r./car_price_prediction.csv)#查看前5行数据 print(data.head(5))output:ID Price Levy ... Wheel Color Airbags 0 45654403 13328 1399 ... Left wheel Silve…

llama3模型部署时遇到的问题及解决方案

在llama3模型部署时&#xff0c;会遇到一系列问题&#xff0c;这里就作者所遇到的问题与解决方法分享一下。 注意&#xff1a;这里是从llama3 github主页上给的方法一步步做的&#xff0c;不适用于其他部署大模型的方法。 文章目录 ERROR 403&#xff1a;Forbidden安装依赖时出…

50-3 内网信息收集 - 域环境搭建

搭建准备: 在搭建准备阶段,我们需要准备三台 Windows 虚拟机:Windows Server 2012、Windows 7 和 Windows Server 2008。接下来,我们将配置 Windows Server 2012 作为域控制器,而 Windows 7 和 Windows Server 2008 将作为成员机加入域。建议保持这三台虚拟机的内存不超过…

Go环境安装---附带每一步截图

Windows环境 Go安装包下载 下载后直接安装步骤按照即可。 测试 winR 输入cmd 在命令行输出go version可以看到自己的版本。 go env 查看环境变量 在桌面创建hello.go的文件 编写代码。注意&#xff0c;编码必修是UTF-8 在命令行输入路径刚刚代码所在的路径&#x…

云原生之容器编排实践-OpenEuler23.09在线安装Kubernetes与KubeSphere

背景 前几篇文章中介绍了如何将 ruoyi-cloud 项目部署到 Kubernetes 集群中&#xff0c;包括网关服务、认证服务和系统服务并且对全部服务采用 YAML 文件的方式来进行部署&#xff0c;这虽然有助于理解 K8S 组织管理资源的风格与底层机制&#xff0c;但是对于团队中不太熟悉命…

隧道FM调频广播信号泄漏电缆+天线覆盖方案

泄露电缆信号具有信号均匀&#xff0c;覆盖效果好等特点&#xff0c;但是由于造价昂贵及工程施工量大让一部分工程望而却步&#xff0c;现介绍一种性价比稍高一点的&#xff0c;泄漏电缆&#xff0b;宽带天线的方案。如图&#xff0c;去掉泄露电缆末端的匹配假负载 &#xff0c…

图书管理系统(附源码)

前言&#xff1a;前面一起和小伙伴们学习了较为完整的Java语法体系&#xff0c;那么本篇将运用这些知识连串在一起实现图书管理系统。 目录 一、总体设计 二、书籍与书架 书籍&#xff08;Book&#xff09; 书架&#xff08;Booklist&#xff09; 三、对图书的相关操作 I…

[C++][设计模式][适配器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件系统中&#xff0c;由于应用环境的变化&#xff0c;常常需要将”一些现存的对象“放在新的环境中应用&#xff0c;但是新环境要求的接口是这些现存对象所不满足如何应对这些”迁移的变化“&#xff1f;如何既能利用现…

第一节:如何开发第一个spring boot3.x项目(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;从今天开始&#xff0c;我会记录每篇我自学spring boot3.x的经验。只要我不偷懒&#xff0c;学完应该很快&#xff0c;哈哈&#xff0c;更新速度尽可能快&#xff0c;想和大佬们一块讨论&#xff0c;如果需要讨论的欢迎一起评论区留…

基于MongoDB的电影影评分析

项目源码及资料 项目介绍 1、从豆瓣网爬取Top10的电影数据 爬取网址: https://movie.douban.com/top250 1.1 爬取Top10的影视信息 mv_data [] i 0 for x in soup.select(.item):i 1mv_name re.search(>([^<])<, str(x.select(.info > .hd > a > .tit…