【2024华为OD-E卷-200分-跳格子2】(题目+思路+JavaC++Python解析)

news2025/1/5 8:27:08

题目描述

在一个二维平面上,有一个 n x m 的网格,每个格子有一个非负整数。你从左上角 (0, 0) 开始,每次只能向右或向下移动,目标是到达右下角 (n-1, m-1)。

在移动过程中,你需要记录经过的格子中,最大数字与最小数字的差的最小值。

输入

  • 第一行包含两个整数 n 和 m,表示网格的行数和列数。
  • 接下来的 n 行,每行包含 m 个整数,表示网格中每个格子的值。

输出

  • 输出一个整数,表示从左上角到右下角路径中,最大数字与最小数字的差的最小值。

限制条件

  • 1 <= n, m <= 500
  • 0 <= grid[i][j] <= 10^9

思路分析

这个问题可以转化为求从左上角到右下角路径中的最大值和最小值,并计算它们的差值。我们可以使用动态规划(Dynamic Programming, DP)来求解这个问题。

  1. 定义状态
    • maxDP[i][j] 表示从 (0, 0) 到 (i, j) 路径中的最大值。
    • minDP[i][j] 表示从 (0, 0) 到 (i, j) 路径中的最小值。
  2. 状态转移
    • maxDP[i][j] = max(maxDP[i-1][j], maxDP[i][j-1], grid[i][j])
    • minDP[i][j] = min(minDP[i-1][j], minDP[i][j-1], grid[i][j])
  3. 初始化
    • maxDP[0][0] = grid[0][0]
    • minDP[0][0] = grid[0][0]
  4. 计算最终结果
    • 遍历整个 maxDP 和 minDP 数组,计算 maxDP[i][j] - minDP[i][j] 的最小值。

Java 代码解析

public class JumpGrid {
    public static int minDifference(int[][] grid) {
        int n = grid.length;
        int m = grid[0].length;
        
        int[][] maxDP = new int[n][m];
        int[][] minDP = new int[n][m];
        
        maxDP[0][0] = grid[0][0];
        minDP[0][0] = grid[0][0];
        
        for (int i = 1; i < n; i++) {
            maxDP[i][0] = Math.max(maxDP[i-1][0], grid[i][0]);
            minDP[i][0] = Math.min(minDP[i-1][0], grid[i][0]);
        }
        
        for (int j = 1; j < m; j++) {
            maxDP[0][j] = Math.max(maxDP[0][j-1], grid[0][j]);
            minDP[0][j] = Math.min(minDP[0][j-1], grid[0][j]);
        }
        
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                maxDP[i][j] = Math.max(maxDP[i-1][j], Math.max(maxDP[i][j-1], grid[i][j]));
                minDP[i][j] = Math.min(minDP[i-1][j], Math.min(minDP[i][j-1], grid[i][j]));
            }
        }
        
        int minDiff = Integer.MAX_VALUE;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                minDiff = Math.min(minDiff, maxDP[i][j] - minDP[i][j]);
            }
        }
        
        return minDiff;
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[][] grid = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                grid[i][j] = scanner.nextInt();
            }
        }
        System.out.println(minDifference(grid));
    }
}

C++ 代码解析

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

int minDifference(vector<vector<int>>& grid) {
    int n = grid.size();
    int m = grid[0].size();
    
    vector<vector<int>> maxDP(n, vector<int>(m));
    vector<vector<int>> minDP(n, vector<int>(m));
    
    maxDP[0][0] = grid[0][0];
    minDP[0][0] = grid[0][0];
    
    for (int i = 1; i < n; i++) {
        maxDP[i][0] = max(maxDP[i-1][0], grid[i][0]);
        minDP[i][0] = min(minDP[i-1][0], grid[i][0]);
    }
    
    for (int j = 1; j < m; j++) {
        maxDP[0][j] = max(maxDP[0][j-1], grid[0][j]);
        minDP[0][j] = min(minDP[0][j-1], grid[0][j]);
    }
    
    for (int i = 1; i < n; i++) {
        for (int j = 1; j < m; j++) {
            maxDP[i][j] = max({maxDP[i-1][j], maxDP[i][j-1], grid[i][j]});
            minDP[i][j] = min({minDP[i-1][j], minDP[i][j-1], grid[i][j]});
        }
    }
    
    int minDiff = INT_MAX;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            minDiff = min(minDiff, maxDP[i][j] - minDP[i][j]);
        }
    }
    
    return minDiff;
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> grid(n, vector<int>(m));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> grid[i][j];
        }
    }
    cout << minDifference(grid) << endl;
    return 0;
}

Python 代码解析

def min_difference(grid):
    n = len(grid)
    m = len(grid[0])
    
    max_dp = [[0] * m for _ in range(n)]
    min_dp = [[0] * m for _ in range(n)]
    
    max_dp[0][0] = grid[0][0]
    min_dp[0][0] = grid[0][0]
    
    for i in range(1, n):
        max_dp[i][0] = max(max_dp[i-1][0], grid[i][0])
        min_dp[i][0] = min(min_dp[i-1][0], grid[i][0])
    
    for j in range(1, m):
        max_dp[0][j] = max(max_dp[0][j-1], grid[0][j])
        min_dp[0][j] = min(min_dp[0][j-1], grid[0][j])
    
    for i in range(1, n):
        for j in range(1, m):
            max_dp[i][j] = max(max_dp[i-1][j], max_dp[i][j-1], grid[i][j])

 

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

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

相关文章

电路学习之前言

1.作为一名嵌入式开发者&#xff0c;去学习电路是必经之路。如果是一名嵌入式软件开发者&#xff0c;可能对电路和硬件的开发要求是能看懂电路图即可&#xff0c;但是&#xff0c;学习电路可以进一步提高看电路图的能力&#xff0c;可以提升自己的整体实力水平。而且&#xff0…

Java反射详解(二)

上一篇博客&#xff1a;Java反射详解&#xff08;一&#xff09; 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.c…

zentao ubuntu上安装

#下载ZenTaoPMS-21.2-zbox_amd64.tar.gz&#xff08;https://www.zentao.net/downloads.html&#xff09; https://dl.zentao.net/zentao/21.2/ZenTaoPMS-21.2-zbox_amd64.tar.gzcd /opt tar -zxvf ZenTaoPMS-21.2-zbox_amd64.tar.gz#启动 /opt/zbox/zbox start /opt/zbox/zbox…

逆境清醒文章总目录表

逆境清醒文章总目录表 零、时光宝盒&#x1f33b; &#xff08;https://blog.csdn.net/weixin_69553582 逆境清醒&#xff09; 《你的答案》歌曲原唱&#xff1a;阿冗&#xff0c;填 词&#xff1a;林晨阳、刘涛&#xff0c;谱曲&#xff1a;刘涛 也许世界就这样&#xff0c…

【嵌入式硬件】嵌入式显示屏接口

数字显示串行接口&#xff08;Digital Display Serial Interface&#xff09; SPI 不过多赘述。 I2C-bus interface 不过多赘述 MIPI DSI MIPI (Mobile Industry Processor Interface) Alliance, DSI (Display Serial Interface) 一般用于移动设备&#xff0c;下面是接口…

AI证件照制作 API 快速生成示例

AI证件照制作 API 快速生成证件照示例 本文将介绍一种 AI证件照制作 API 对接说明&#xff0c;它是可以通过输入人像照片URL以及自己喜欢的模板来制作各种风格的证件照。 接下来介绍下 AI证件照制作 API 的对接说明。 申请流程 要使用 API&#xff0c;需要先到 AI证件照制作…

一个在ios当中采用ObjectC和opencv来显示图片的实例

前言 在ios中采用ObjectC编程利用opencv来显示一张图片&#xff0c;并简单绘图。听上去似乎不难&#xff0c;但是实际操作下来&#xff0c;却不是非常的容易的。本文较为详细的描述了这个过程&#xff0c;供后续参考。 一、创建ios工程 1.1、选择ios工程类型 1.2、选择接口模…

006-Jetpack Compose for Android之传感器数据

需求分析 想要看看手机的传感器数据&#xff0c;看看滤波一下能玩点什么无聊的。先搞个最简单的&#xff0c;手机本身的姿态。 需求&#xff1a;采集手机姿态数据&#xff0c;显示在界面上。 那么我们需要&#xff1a; 一个文本标签类似的控件&#xff0c;显示手机姿态数据…

SpringBoot3 快速启动框架

文章目录 1 SpringBoot3 介绍 1.1 SpringBoot3 简介1.2 快速入门1.3 入门总结 2 SpringBoot3 配置文件 2.1 统一配置管理概述2.2 属性配置文件使用2.3 YAML配置文件使用2.4 批量配置文件注入2.5 多环境配置和使用 3 SpringBoot 整合 springMVC 3.1 实现过程3.2 web相关配置3.3…

大型ERP系统GL(总账管理)模块需求分析

主要介绍了GL系统的需求分析&#xff0c;包括系统概述、功能描述、帐薄管理、报表管理、期末处理、财务报表以及凭证的快速输入方式、可用性设计、保存、自动审核和打印等方面的内容。系统概述部分介绍了系统的功能结构和模块流程图。 功能描述部分详细描述了系统的基础资料和业…

利用python将图片转换为pdf格式的多种方法,实现批量转换,内置模板代码,全网最全,超详细!!!

文章目录 前言1、img2pdf库的使用1.2 安装img2pdf库1.3 案例演示&#xff08;模板代码&#xff09; 2、Pillow库的使用2.1 pillow库的安装2.2 案例演示&#xff08;模板代码&#xff09; 3、PyMuPDF库的使用3.1 安装pymupdf库3.2 案例演示&#xff08;模板代码&#xff09;2.3 …

协议幻变者:DeviceNet转ModbusTCP网关开启机器手臂智能新纪元

技术背景DeviceNet是一种广泛应用于工业自动化领域的现场总线标准&#xff0c;它能够实现控制器与现场设备之间的高效通信&#xff0c;常用于连接各种传感器、执行器以及其他工业设备&#xff0c;如机器人、电机驱动器等&#xff0c;具有实时性强、可靠性高的特点。而ModbusTCP…

Linux 安装运行gatk的教程

1.下载安装 wget https://github.com/broadinstitute/gatk/releases/download/4.1.8.1/gatk-4.1.8.1.zip2.解压 unzip *.zip3.查看 gatk --help 如下显示表示安装成功&#xff1a; 注意&#xff1a;仅限在该包所在位置的路径下能使用

使用Xilinx PCIE XDMA框架读写访问DDR3内容

在 FPGA 开发中&#xff0c;使用 XDMA&#xff08;PCIe DMA&#xff09;是实现主机和 FPGA 之间数据传输的常见方法。xdma_rw.exe 是一个官方提供的命令行工具&#xff0c;用于与 FPGA 进行读写操作&#xff0c;支持从 PCIe 总线读取或写入数据。我利用xdma框架实现了DDR3内存的…

【论文笔记之 Mega-TTS2】Boosting Prompting Mechanisms For Zero-Shot Speech Synthesis

本文对 Ziyue Jiang 等人于 2024 年发表的论文进行简单地翻译。如有表述不当之处欢迎批评指正。欢迎任何形式的转载&#xff0c;但请务必注明出处。 论文链接&#xff1a;https://arxiv.org/pdf/2307.07218 目录 Abstract1. 介绍2. 背景3. 方法3.1. 解耦出韵律和音色3.2. 压缩…

haproxy+nginx负载均衡实验

准备三台虚拟机&#xff1a; HAProxy 服务器192.168.65.131Web 服务器 1192.168.65.132Web 服务器 2192.168.65.133 在 HAProxy 服务器&#xff08;192.168.65.131&#xff09;上操作&#xff1a; 安装 HAProxy&#xff1a; sudo yum install -y haproxy编辑 HAProxy 配置…

[论文阅读] (34)ESWA2024 基于SGDC的轻量级入侵检测系统

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

华三交换机怎么进行链路聚合?

目录 准备&#xff1a;两台交换机 配置&#xff1a;进行交换机配置 完成&#xff1a;检查链路聚合是否成功 准备&#xff1a;两台交换机 1、进行连线 2、上行Core交换机都选取 Ten-GigabitEthernet1/0/51、Ten-GigabitEthernet1/0/52和 Ten-GigabitEthernet2/0/51、Ten-Giga…

【无线传感网】无线传感器网络覆盖技术

文章目录 覆盖算法设计思路及性能评价标准覆盖感知模型布尔感知模型概率感知模型 无线传感网络覆盖算法分类按照配置方式确定性覆盖随机性覆盖 根据覆盖目标面覆盖点覆盖栅栏覆盖 典型的WSN覆盖算法与协议基于网格的覆盖定位传感器配置算法圆周覆盖连通传感器覆盖轮换活跃/休眠…

积分图(Integral Image)与均值滤波的快速实现

积分图&#xff08;Integral Image&#xff09;也称为求和图&#xff08;Summed Area Table&#xff09;&#xff0c;是一种用于快速计算图像中任意矩形区域像素值总和的技术。 基本概念 积分图的每个位置(i, j)存储的是从图像左上角(1, 1)到当前位置(i, j)所有像素值的累积和…