【动态规划】【hard】力扣1301. 最大得分的路径数目

2024-08-27 07:44

本文主要是介绍【动态规划】【hard】力扣1301. 最大得分的路径数目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

给你一个正方形字符数组 board ,你从数组最右下方的字符 ‘S’ 出发。

你的目标是到达数组最左上角的字符 ‘E’ ,数组剩余的部分为数字字符 1, 2, …, 9 或者障碍 ‘X’。在每一步移动中,你可以向上、向左或者左上方移动,可以移动的前提是到达的格子没有障碍。

一条路径的 「得分」 定义为:路径上所有数字的和。

请你返回一个列表,包含两个整数:第一个整数是 「得分」 的最大值,第二个整数是得到最大得分的方案数,请把结果对 10^9 + 7 取余。

如果没有任何路径可以到达终点,请返回 [0, 0] 。

示例 1:
输入:board = [“E23”,“2X2”,“12S”]
输出:[7,1]

示例 2:
输入:board = [“E12”,“1X1”,“21S”]
输出:[4,2]

示例 3:
输入:board = [“E11”,“XXX”,“11S”]
输出:[0,0]

提示:
2 <= board.length == board[i].length <= 100

动态规划

using PII = pair<int, int>;class Solution {
private:static constexpr int mod = (int)1e9 + 7;public:void update(vector<vector<PII>>& dp, int n, int x, int y, int u, int v){if(u >= n || v >= n || dp[u][v].first == -1){return;}if(dp[u][v].first > dp[x][y].first){dp[x][y] = dp[u][v];}else if(dp[u][v].first == dp[x][y].first){dp[x][y].second += dp[u][v].second;if(dp[x][y].second >= mod){dp[x][y].second -= mod;}}}vector<int> pathsWithMaxScore(vector<string>& board) {int n = board.size();vector<vector<PII>> dp(n, vector<PII>(n, {-1, 0}));dp[n-1][n-1] = {0, 1};for(int i = n - 1; i >= 0; i--){for(int j = n - 1; j >= 0; j--){if(!(i== n - 1 && j == n - 1) && board[i][j] != 'X'){update(dp, n, i, j, i+1, j);update(dp, n, i, j, i, j+1);update(dp, n, i, j, i+1, j+1);if(dp[i][j].first != -1){dp[i][j].first += (board[i][j] == 'E' ? 0 : board[i][j] - '0');}}}}return dp[0][0].first == -1 ? vector<int>{0,0} : vector<int>{dp[0][0].first, dp[0][0].second};}
};

这题由于要维护两个数组,而且要处理很多情况,所以处理过程较为复杂。先看主函数中,我们从右下角向左,向上来遍历所有网格。当处理一个网格的时候(当网格不在边缘时),他的最大得分和三个格子有关分别是下,右,右下。于是我们定义一个函数update用来减少代码量。

当处理一个网格的时候,如果他下或者右或者右下三个格子如果在网格外,那么就不考虑他,直接return。如果比较的格子最大得分大小比他大,那么就更新当前网格,如果得分等于比较的格子的话,那么就将路径数量+1,假设如果数量加一后,遇到另一个比较的格子比他大,那么又会更新成那个格子的dp(无论是得分还是路径数量)。

更新完了后,就要加上自身的得分,首先要判断是不是终点E,如果是的话,就加上0,不然的话就加上自身得分,由于是字符串,所以要减去’0’,才能得到整型。

最后返回终点E的dp,如果得分是-1,说明没有路径可以到达,返回{0,0},否则就返回他的最大得分和路径和。

这篇关于【动态规划】【hard】力扣1301. 最大得分的路径数目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111062

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

浅谈MySQL的容量规划

《浅谈MySQL的容量规划》进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下... 目录一、评估当前资源使用情况1.1 磁盘空间使用1.2 内存使用1.3 CPU使用1.4 网络带宽二、

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关