每日一题——不同路径的数目与矩阵最小路径和

news2025/4/21 4:17:24

机器人路径问题与矩阵最小路径和

    • 1. 机器人路径问题
      • 题目描述
      • 示例
        • 示例 1
        • 示例 2
      • 解题思路
        • 动态规划
      • 代码实现
      • 复杂度分析
    • 2. 矩阵的最小路径和
      • 题目描述
      • 示例
        • 示例 1
        • 示例 2
      • 解题思路
        • 动态规划
      • 代码实现
      • 复杂度分析
    • 总结

1. 机器人路径问题

题目描述

一个机器人在 (m \times n) 大小的地图的左上角(起点)。机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。可以有多少种不同的路径从起点走到终点?
在这里插入图片描述
数据范围:
(0 < n, m \leq 100),保证计算结果在 32 位整型范围内。

要求:

  • 空间复杂度:(O(nm))
  • 时间复杂度:(O(nm))
  • 进阶:空间复杂度 (O(1)),时间复杂度 (O(\min(n, m)))

示例

示例 1

输入:
2, 1
返回值:
1

示例 2

输入:
2, 2
返回值:
2


解题思路

动态规划
  1. 定义状态

    • dp[i][j] 表示从起点到位置 (i, j) 的不同路径数。
  2. 状态转移方程

    • 机器人只能向下或向右移动,因此:
      [
      dp[i][j] = dp[i-1][j] + dp[i][j-1]
      ]
  3. 边界条件

    • 当 (i = 1) 或 (j = 1) 时,dp[i][j] = 1,因为只有一条路径(一直向右或一直向下)。
  4. 目标

    • 计算 dp[m][n],即从起点到终点的路径数。

代码实现

#include <stdio.h>
#include <stdlib.h>

int uniquePaths(int m, int n) {
    // 分配动态规划表
    int** dp = (int**)calloc(m + 1, sizeof(int*));
    for (int i = 0; i <= m; i++) {
        dp[i] = (int*)calloc(n + 1, sizeof(int));
    }

    // 初始化边界条件
    for (int i = 1; i <= m; i++) {
        dp[i][1] = 1;
    }
    for (int j = 1; j <= n; j++) {
        dp[1][j] = 1;
    }

    // 填充动态规划表
    for (int i = 2; i <= m; i++) {
        for (int j = 2; j <= n; j++) {
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        }
    }

    // 获取结果
    int num = dp[m][n];

    // 释放动态规划表
    for (int i = 0; i <= m; i++) {
        free(dp[i]);
    }
    free(dp);

    return num;
}

复杂度分析

  • 时间复杂度:(O(m \times n)),需要填充 (m \times n) 的动态规划表。
  • 空间复杂度:(O(m \times n)),用于存储动态规划表。

2. 矩阵的最小路径和

题目描述

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

数据范围:
(1 \leq n, m \leq 500),矩阵中任意值都满足 (0 \leq a_{i,j} \leq 100)。

要求:

  • 时间复杂度:(O(nm))

示例

在这里插入图片描述

示例 1

输入:
[[1,3,5,9],[8,1,3,4],[5,0,6,1],[8,8,4,0]]
返回值:
12

示例 2

输入:
[[1,2,3],[1,2,3]]
返回值:
7


解题思路

动态规划
  1. 定义状态

    • dp[i][j] 表示从起点到位置 (i, j) 的最小路径和。
  2. 状态转移方程

    • 只能从上方或左方移动,因此:
      [
      dp[i][j] = a[i-1][j-1] + \min(dp[i-1][j], dp[i][j-1])
      ]
  3. 边界条件

    • 当 (i = 1) 且 (j = 1) 时,dp[1][1] = a[0][0]
    • 当 (i = 1) 时,只能从左方移动,dp[1][j] = dp[1][j-1] + a[0][j-1]
    • 当 (j = 1) 时,只能从上方移动,dp[i][1] = dp[i-1][1] + a[i-1][0]
  4. 目标

    • 计算 dp[n][m],即从起点到终点的最小路径和。

代码实现

#include <stdio.h>
#include <stdlib.h>

int minPathSum(int** matrix, int matrixRowLen, int* matrixColLen) {
    int m = matrixRowLen; // 行数
    int n = *matrixColLen; // 列数

    // 分配动态规划表
    int** dp = (int**)calloc(m + 1, sizeof(int*));
    for (int i = 0; i <= m; i++) {
        dp[i] = (int*)calloc(n + 1, sizeof(int));
    }

    // 初始化边界条件
    for (int i = 0; i <= m; i++) {
        dp[i][0] = 65535; // 初始化为一个较大的值
    }
    for (int j = 0; j <= n; j++) {
        dp[0][j] = 65535; // 初始化为一个较大的值
    }
    dp[1][1] = matrix[0][0]; // 特殊处理起点

    // 填充动态规划表
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (i == 1 && j == 1) {
                continue; // 起点已经初始化
            }
            dp[i][j] = matrix[i - 1][j - 1] + ((dp[i - 1][j] < dp[i][j - 1]) ? dp[i - 1][j] : dp[i][j - 1]);
        }
    }

    // 获取结果
    int num = dp[m][n];

    // 释放动态规划表
    for (int i = 0; i <= m; i++) {
        free(dp[i]);
    }
    free(dp);

    return num;
}

复杂度分析

  • 时间复杂度:(O(m \times n)),需要填充 (m \times n) 的动态规划表。
  • 空间复杂度:(O(m \times n)),用于存储动态规划表。

总结

  • 机器人路径问题:通过动态规划计算从起点到终点的路径数。
  • 矩阵最小路径和:通过动态规划计算从起点到终点的最小路径和。
  • 动态规划是解决路径问题的有效方法,关键在于定义状态和状态转移方程。

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

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

相关文章

143,【3】 buuctf web [GYCTF2020]EasyThinking

进入靶场 一开始那个题目名字就想到了框架 扫描目录 访问后自动下载了 找源码 <?php namespace app\home\controller;use think\exception\ValidateException; use think\facade\Db; use think\facade\View; use app\common\model\User; use think\facade\Request; use …

腾讯混元hunyuan3d生成模型,本地搭建和使用

腾讯混元hunyuan3d生成模型,本地搭建和使用 腾讯混元hunyuan3d生成模型,本地搭建和使用一. 话不多说,我们直接上本地部署的详细步骤1. 将仓库拉到本地2. 下载2个模型, 注意这里推荐 先使用conda创建环境后在安装modelscope进行下载模型2.1 关于第一个模型我们要在 Hunyuan3D-1 …

flutter image_cropper插件安装后 打包apk 报错命名空间问题

本篇文章主要讲解&#xff0c;Flutter安装完新依赖打包apk报错 A problem occurred configuring project ‘:image_cropper’. 命名空间问题的解决办法及原因说明。 日期&#xff1a;2025年2月15日 作者&#xff1a;任聪聪 一、报错现象&#xff1a; 报文信息&#xff1a; FAI…

2025-2-15-4.5 链表(基础题)

文章目录 4.6 链表&#xff08;基础题&#xff09;206. 反转链表92. 反转链表II24. 两两交换链表中的节点 4.6 链表&#xff08;基础题&#xff09; 有一天我做题忽然发现要把一个数组完全倒着翻过来很费劲&#xff0c;今天看&#xff0c;链表为此而生啊。 206. 反转链表 题目…

免费大模型网站

腾讯元宝 腾讯元宝 秘塔搜索 秘塔搜索 超算互联网 超算互联网回答速度很慢 Chatbot Arena Chatbot Arena 大模型竞技场。

macOS部署DeepSeek-r1

好奇&#xff0c;跟着网友们的操作试了一下 网上方案很多&#xff0c;主要参考的是这篇 DeepSeek 接入 PyCharm&#xff0c;轻松助力编程_pycharm deepseek-CSDN博客 方案是&#xff1a;PyCharm CodeGPT插件 DeepSeek-r1:1.5b 假设已经安装好了PyCharm PyCharm: the Pyth…

java八股文-mysql

1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树&#xff0c;最坏情况o&…

YOLO11环境搭建CUDA12.6

1.安装CUDA和cuDNN 1.1安装CUDA 1.1.1查看当前你的电脑显卡支持的最高CUDA版本,后面的安装不能超过它 通过命令的方式查看 输入nvidia-smi 1.1.2 下载CUDA 官网地址:CUDA Toolkit Archive | NVIDIA Developer 选择cuda_12.6.3 下载完成后,如下: 安装,一直下一步即可:…

OpenEuler学习笔记(三十二):在OpenEuler上搭建项目管理平台

在OpenEuler上搭建一个支持网页和手持访问、且支持用户功能自定义的项目管理平台&#xff0c;可以选择多种开源工具。以下是基于 Redmine 的搭建方案&#xff0c;Redmine 是一个灵活的项目管理工具&#xff0c;支持网页和移动端访问&#xff0c;并且可以通过插件扩展功能。 1.…

LabVIEW中的icon.llb 库

icon.llb 库位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform 目录下&#xff0c;是 LabVIEW 系统中的一个重要库。它的主要功能是与图标相关的操作&#xff0c;提供了一些实用的 VI 用于处理 LabVIEW 图标的显示、修改和设置。通过该库&#x…

React Hooks 的两个坑点

React Hooks 使用注意事项 Area: Hooks Date: February 10, 2025 Important: &#x1f31f;&#x1f31f;&#x1f31f; React Hooks 注意事项 要点&#xff1a; useState 的初始化值 只在第一次渲染时计算&#xff0c;并且这个值不会随着组件重新渲染而更新。useEffect 可…

Oracle启动与关闭(基础操作)

11g读取参数文件的顺序 9i之前&#xff0c;只有静态参数文件pfile文件。 9i开始&#xff0c;引入了动态参数文件spfile文件。 Windows&#xff1a; %ORACLE_HOME%\database SPFILEORCL就是动态参数文件 Linux&#xff1a; $ORACLE_HOME/dbs 11g中&#xff0c;启动数据库。…

新版电脑通过wepe安装系统

官方下载链接 WIN10下载 WIN11下载 微PE 启动盘制作 1&#xff1a;选择启动盘的设备 2&#xff1a;选择对应的U盘设备&#xff0c;点击安装就可以&#xff0c;建议大于8g 3&#xff1a;在上方链接下载需要安装的程序包&#xff0c;放入启动盘&#xff0c;按需 更新系统 …

Jmeter断言、关联、录制脚本

Jmeter断言 断言&#xff1a;让程序自动判断预期结果和实际结果是否一致 提示: Jmeter在请求的返回层面有个自动判断机制&#xff08;响应状态码 2xx:成功&#xff0c;4xx/5xx:失败&#xff09;但是请求成功了&#xff0c;并不代表结果一定正确&#xff0c;因此需要检测机制提…

SpringBoot速成(12)文章分类P15-P20

1.新增文章分类 1.Postman登录不上&#xff0c;可以从头registe->login一个新的成员:注意&#xff0c;跳转多个url时&#xff0c;post/get/patch记得修改成controller类中对应方法上写的 2.postman运行成功&#xff1a; 但表中不更新&#xff1a;细节有问题&#xff1a; c是…

RedHat8安装postgresql15和 postgis3.4.4记录及遇到的问题总结

安装包对照版本参考 UsersWikiPostgreSQLPostGIS – PostGIS 如果Red Hat系统上有旧版本的PostgreSQL需要卸载 在较新的Red Hat版本&#xff0c;使用dnf包管理器卸载&#xff1a;sudo dnf remove postgresql-server postgresql 旧版本&#xff0c;使用yum包管理器卸载 sudo y…

深入解析计算机网络请求头:常见类型与安全性影响

目录 1. Host 2. User-Agent 3. Cookie 4. Referer&#xff08;或 Referrer&#xff09; 5. Authorization 6. Content-Type 7. Content-Length 8. Origin 9. X-Forwarded-For (XFF) 10. Upgrade-Insecure-Requests 11. X-Frame-Options 12. Cache-Control 13. Ac…

VisoMaster整合包及汉化

VisoMaster是个图片及视频换脸工具&#xff0c;速度快&#xff0c;性能十分强大。 VisoMaster安装有2种方式&#xff0c;根据官网指引安装也十分简单&#xff0c;在此就不重复&#xff0c;只说说安装过程中要注意的事项&#xff1a; 1、自动安装&#xff1a;需要在网络十分畅…

从安装软件到flask框架搭建可视化大屏(二)——创建一个flask页面,搭建可视化大屏,零基础也可以学会

附录&#xff1a;所有文件的完整代码 models.py # models/models.py from flask_sqlalchemy import SQLAlchemydb SQLAlchemy()class User(db.Model):__tablename__ user # 显式指定表名为 userid db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(…

[JVM篇]垃圾回收器

垃圾回收器 Serial Seral Old PartNew CMS(Concurrent Mark Sweep) Parallel Scavenge Parallel Old G1 ZGC