矩阵中的最大得分(Lc3148)——动态规划

news2024/11/16 18:07:50

给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格(不必相邻)。从值为 c1 的单元格移动到值为 c2 的单元格的得分为 c2 - c1 。

你可以从 任一 单元格开始,并且必须至少移动一次。

返回你能得到的 最大 总得分。

示例 1:

输入:grid = [[9,5,7,3],[8,9,6,1],[6,7,14,3],[2,5,3,1]]

输出:9

解释:从单元格 (0, 1) 开始,并执行以下移动:
- 从单元格 (0, 1) 移动到 (2, 1),得分为 7 - 5 = 2 。
- 从单元格 (2, 1) 移动到 (2, 2),得分为 14 - 7 = 7 。
总得分为 2 + 7 = 9 。

示例 2:

输入:grid = [[4,3,2],[3,2,1]]

输出:-1

解释:从单元格 (0, 0) 开始,执行一次移动:从 (0, 0) 到 (0, 1) 。得分为 3 - 4 = -1 。

提示:

  • m == grid.length
  • n == grid[i].length
  • 2 <= m, n <= 1000
  • 4 <= m * n <= 105
  • 1 <= grid[i][j] <= 105

问题简要描述:返回最大总得分

细节阐述:

  1. f[i][j] 表示以 (i,j) 为终点的路径的最小值

Java

class Solution {
    public int maxScore(List<List<Integer>> grid) {
        int m = grid.size(), n = grid.get(0).size();
        int[][] f = new int[m + 1][n + 1];
        int inf = 1 << 30, ans = -inf;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                int min = inf;
                if (i > 0) {
                    min = Math.min(min, f[i - 1][j]);
                }
                if (j > 0) {
                    min = Math.min(min, f[i][j - 1]);
                }
                ans = Math.max(ans, grid.get(i).get(j) - min);
                f[i][j] = Math.min(grid.get(i).get(j), min);
            }
        }
        return ans;
    }
}

 Python3

class Solution:
    def maxScore(self, grid: List[List[int]]) -> int:
        f = [[0] * len(grid[0]) for _ in range(len(grid))]
        ans = -inf
        for i, row in enumerate(grid):
            for j, x in enumerate(row):
                mi = inf
                if i:
                    mi = min(mi, f[i - 1][j])
                if j:
                    mi = min(mi, f[i][j - 1])
                ans = max(ans, grid[i][j] - mi)
                f[i][j] = min(grid[i][j], mi)
        return ans

TypeScript

function maxScore(grid: number[][]): number {
    const [m, n] = [grid.length, grid[0].length];
    const f = Array.from({length: m}, () => Array.from({length: n}, () => 0));
    let ans = -Infinity;
    for (let i = 0; i < m; i++) {
        for (let j = 0; j < n; j++) {
            let min = Infinity;
            if (i > 0) {
                min = Math.min(min, f[i - 1][j]);
            }
            if (j > 0) {
                min = Math.min(min, f[i][j - 1]);
            }
            ans = Math.max(ans, grid[i][j] - min);
            f[i][j] = Math.min(grid[i][j], min);
        }
    }
    return ans;    
};

C++

class Solution {
public:
    int maxScore(vector<vector<int>>& grid) {
		int m = grid.size(), n = grid[0].size();
		int f[m][n];
		int inf = 1 << 30, ans = -inf;
		for (int i = 0;i < m;i++) {
			for (int j = 0;j < n;j++) {
				int mi = inf;
				if (i > 0) {
					mi = min(mi, f[i - 1][j]);
				}
				if (j > 0) {
					mi = min(mi, f[i][j - 1]);
				}
				ans = max(ans, grid[i][j] - mi);
				f[i][j] = min(grid[i][j], mi);
			}
		}
		return ans;        
    }
};

Go

func maxScore(grid [][]int) int {
	m, n := len(grid), len(grid[0])
	f := make([][]int, m)
	for i := range f {
		f[i] = make([]int, n)
	}
	const inf int = 1 << 30
	ans := -inf
	for i, row := range grid {
		for j, x := range row {
			mi := inf
			if i > 0 {
				mi = min(mi, f[i-1][j])
			}
			if j > 0 {
				mi = min(mi, f[i][j-1])
			}
			ans = max(ans, x-mi)
			f[i][j] = min(x, mi)
		}
	}
	return ans
}

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

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

相关文章

STM32G0系列配置Freertos所管理的最高中断优先级

最近在G070上部署Freertos&#xff0c;用cubemx生成的时候发现无法选择freertos所能管理的最高优先级和最低优先级&#xff0c;即configMAX_SYSCALL_INTERRUPT_PRIORITY和LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY。我们可以发现在F103RCT6上是可以选择这两个优先级限制的&#…

树莓派开发笔记01-树莓派的系统烧录以及初次开机配置

github主页&#xff1a;https://github.com/snqx-lqh gitee主页&#xff1a;https://gitee.com/snqx-lqh 本项目github地址&#xff1a;https://github.com/snqx-lqh/RaspberryPiLearningNotes 本项目gitee地址&#xff1a;https://gitee.com/snqx-lqh/RaspberryPiLearningNote…

详解golang内存管理

介绍 要搞明白 Go 语言的内存管理,就必须先理解操作系统以及机器硬件是如何管理内存的。因为 Go 语言的内部机制是建立在这个基础之上的,它的设计,本质上就是尽可能的会发挥操作系统层面的优势,而避开导致低效情况。 操作系统内存管理 其实现在计算机内存管理的方式都是…

Python---容器

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.容器概念 在Python中&#xff0c;容器是指可以存放多个元素的对象。常见的容器类型有列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、集合&#xff08;Set&#xf…

solidwork经验总结2

新建<装配体 打开之后可以直接从文件夹将零件中拖入&#xff0c;也可以 怎样装配在一起&#xff1f; 点击配合。 假如我要把轴承装到这个孔里面来 首先&#xff0c;它们一定得是共线 然后点击这两个圆 产生同轴心 选择重合&#xff0c;可以两个贴紧 上面这个也可以按照需求…

ECEF地心地固坐标系与ENU站心坐标系互转

ENU站心坐标系 站心坐标系也叫做站点坐标系、东-北-天坐标系ENU&#xff0c;英文名称是local Cartesian coordinates coordinate system&#xff0c;主要是用于需了解以观察者为中心的其他物体运动规律。 站心直角坐标系 定义&#xff1a;以站心&#xff08;如GPS接收天线中…

植物生长时为什么会扭动?科学家解开令查尔斯·达尔文困惑的千古之谜

在一项新的研究中&#xff0c;来自美国和以色列的物理学家可能已经弄清了植物生长过程中的一种古怪行为–也是查尔斯-达尔文本人在其生命的最后几十年里所好奇的一个谜&#xff1a;对于许多人类来说&#xff0c;植物可能看起来静止不动&#xff0c;甚至有点无趣。但实际上&…

小米5c解除BL锁刷机root

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 解锁BL锁 1. 下载安装 miflash_unlock&#xff1a;https://miuiver.com/miunlock/&#xff0c;登录小米账号&#xff08;需要和解锁设备绑定的账号一致&#…

Java Web —— 第六天(Mybatis)

lombok Lombok是一个实用的Java类库&#xff0c;能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法&#xff0c;并可以自动化生成日志变量&#xff0c;简化java开发、提高效率 在pom.xml文件中引入依赖 <!--lombok--><dependency>…

Spring IoCDI(中)--IoC的进步

通过上文的讲解和学习, 我们已经知道了Spring IoC 和DI的基本操作, 接下来我们来系统的学习Spring IoC和DI 的操作. 前⾯我们提到IoC控制反转&#xff0c;就是将对象的控制权交给Spring的IOC容器&#xff0c;由IOC容器创建及管理对 象&#xff0c;也就是bean的存储。 1. Bean的…

Datawhale AI 夏令营第四期 大模型技术-微调 task3 数据增强与评分

前面我们介绍了baseline的思路及写作方案&#xff0c;这里我们尝试对数据做增强&#xff0c;但是需要聪明的你加入自己的努力完成更好的思路。 今天需要大家学习上手尝试数据增强&#xff0c;不过我会把增强的思路和相关知识告诉大家&#xff0c;让大家学习如何使用llm完成数据…

Ugandan Knuckles

目录 一、题目 二、思路 三、payload 四、思考与总结 一、题目 <!-- Challenge --> <div id"uganda"></div> <script>let wey (new URL(location).searchParams.get(wey) || "do you know da wey?");wey wey.replace(/[<…

铁电存储器(FM24W256)I2C读写驱动(4):I2C读写测试

0 参考资料 FM24W256&#xff08;Cypress公司生产&#xff09;数据手册 1 I2C读写测试 1.1 简单测试方法 使用前面我们设计好的读写驱动&#xff0c;向FM24W256起始地址为0xF0存储区域写入16字节数据“ABCDEFGHIJK12345”&#xff0c;断电后再读取出来&#xff0c;查看读写是…

MySQL基础练习题48-连续出现的数字

目录 题目 准备数据 分析数据 题目 找出所有至少连续出现三次的数字。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Logs (id int, num int)## 向表中插入数据 Truncate table Logs insert into Logs (id, num) values (1, 1) i…

Autodesk Maya 2019 for Mac/Win:专业三维动画制作软件的巅峰之作

Autodesk Maya 2019是一款世界顶级的三维动画制作软件&#xff0c;专为Mac和Windows系统打造&#xff0c;广泛应用于影视广告、角色动画、电影特技等专业领域。其强大的功能和灵活的工具集&#xff0c;使得用户能够高效地完成复杂的三维建模、动画设计、特效制作及高质量渲染等…

Nginx--代理与负载均衡(扩展nginx配置7层协议及4层协议方法、会话保持)

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、代理原理 1、反向代理产生的背景 单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当接入请求过多时&#…

VirtualBox上的Oracle Linux虚拟机安装Docker全流程

1.安装docker依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 2.安装docker仓库 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 生成docker的yum源配置到在 /etc/yum.repos.d/docker-ce.repo 3.安装D…

【软件测试】单元测试20套练习题

&#xff08;一&#xff09;概述 使用Java语言编写应用程序&#xff0c;设计测试数据&#xff0c;完成指定要求的白盒测试&#xff0c;对测试数据及相应测试结果进行界面截图&#xff0c;将代码以及相关截图粘贴到白盒测试报告中。 &#xff08;二&#xff09;题目要求

Keepalived秘籍保障系统高可用的终极武器

目录 一 高可用集群 1.1 集群类型 1.2 实现高可用 1.3 vrrp&#xff08;Virtual Router Redundancy Protocol&#xff09; 二 keepalived 部署 2.1 简介 2.2 keepalived 架构 2.3 keepalived 搭建 三 keepalived 应用示例 3.1 实现master/slave的keepalived单主架构 …

韩顺平老师Python学习笔记【持续更新...】

1、Python语言概述 1.1、转义字符 1.1.1、常用的转义字符 常用转义字符列表 \t一个制表位&#xff0c;实现对齐的功能\n换行符\\一个\\一个\"一个"\r一个回车 1.2、注释 1.2.1、单行注释 # 其他 1.2.2、多行注释 三个单引号 xxx 或 三个双引号 "…