力扣10.12

2267. 检查是否有合法括号字符串路径

题目链接

一个括号字符串是一个 非空 且只包含 和 的字符串。如果下面 任意 条件为 真 ,那么这个括号字符串就是 合法的 。'('')'

字符串是 。()
字符串可以表示为 连接, 和 都是合法括号序列。AB``A``B``A``B
字符串可以表示为 ,其中 是合法括号序列。(A)A
给你一个 的括号网格图矩阵 。网格图中一个 合法括号路径 是满足以下所有条件的一条路径:m x ngrid

路径开始于左上角格子 。(0, 0)
路径结束于右下角格子 。(m - 1, n - 1)
路径每次只会向 下 或者向 右 移动。
路径经过的格子组成的括号字符串是 合法 的。
如果网格图中存在一条 合法括号路径 ,请返回 ,否则返回 。true``false

数据范围

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 100
  • grid[i][j] 要么是 ,要么是 。'('')'

分析

记忆化搜索+剪枝,dfs传入的参数为当前位置坐标(x,y)和此时左括号和右括号的差值c,只有在终点且c==0才满足条件,有几个优化,首先c不能小于0(否则就说明左括号比右括号少,必然不成立),n+m-1必须为偶数,否则差值不可能为偶数

代码

class Solution {
public:const static int N = 105;int dp[N][N][N];int dx[2] = {0, 1};int dy[2] = {1, 0};int n, m;int dfs(int x, int y, vector<vector<char>>& grid, int c) {if(x < 0 || y < 0 || x >= n || y >= m) return 0;if(grid[x][y] == '(') c ++ ;else c -- ;if(c < 0) return 0;int &t = dp[x][y][c];if(t != -1) return t;if(x == n - 1 && y == m - 1) {if(c == 0) return t = 1;else return t = 0;}t = 0;for(int i = 0; i < 2; i ++ ) {int nx = x + dx[i];int ny = y + dy[i];if(dfs(nx, ny, grid ,c)) t = 1; }return t;}bool hasValidPath(vector<vector<char>>& grid) {n = grid.size();m = grid[0].size();for(int i = 0; i < n; i ++ ) {for(int j = 0; j < m; j ++ ) {for(int k = 0; k <= (n + m) / 2; k ++ ) {dp[i][j][k] = -1;}}}if((n + m - 1) % 2) return false;if(grid[0][0] == ')') return false;int res = dfs(0, 0, grid, 0);return res;}
};

1937. 扣分后的最大得分

给你一个 m x n 的整数矩阵 points (下标从 0 开始)。一开始你的得分为 0 ,你想最大化从矩阵中得到的分数。

你的得分方式为:每一行 中选取一个格子,选中坐标为 (r, c) 的格子会给你的总得分 增加 points[r][c]

然而,相邻行之间被选中的格子如果隔得太远,你会失去一些得分。对于相邻行 rr + 1 (其中 0 <= r < m - 1),选中坐标为 (r, c1)(r + 1, c2) 的格子,你的总得分 减少 abs(c1 - c2)

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

abs(x) 定义为:

如果 x >= 0 ,那么值为 x
如果 x < 0 ,那么值为-x

数据范围

  • m == points.length
  • n == points[r].length
  • 1 <= m, n <= 105
  • 1 <= m * n <= 105
  • 0 <= points[r][c] <= 105

分析

令dp[i][j]表示选择points[i][j]的最大得分,暴力枚举上一行的所有列k,则

  • d p [ i ] [ j ] = d p [ i − 1 ] [ k ] + p o i n t s [ i ] [ j ] − ∣ k − j ∣ dp[i][j]=dp[i-1][k]+points[i][j]-|k-j| dp[i][j]=dp[i1][k]+points[i][j]kj
    但是这样子时间复杂度为 O ( n m 2 ) O(nm^2) O(nm2),会超时,得考虑优化
    我们去掉绝对值
  • d p [ i ] [ j ] = { p o i n t s [ i ] [ j ] + m a x ( d p [ i − 1 ] [ k ] ) − ( j − k ) , k ≤ j p o i n t s [ i ] [ j ] + m a x ( d p [ i − 1 ] [ k ] ) − ( k − j ) , k > j dp[i][j]=\begin{cases} points[i][j]+max(dp[i-1][k])-(j-k),k\le j \\ points[i][j]+max(dp[i-1][k])-(k-j),k\gt j \end{cases} dp[i][j]={points[i][j]+max(dp[i1][k])(jk)kjpoints[i][j]+max(dp[i1][k])(kj)k>j

在提出 j j j

  • d p [ i ] [ j ] = { p o i n t s [ i ] [ j ] − j + m a x ( d p [ i − 1 ] [ k ] ) + k ) , k ≤ j p o i n t s [ i ] [ j ] + j + m a x ( d p [ i − 1 ] [ k ] ) − k , k > j dp[i][j]=\begin{cases} points[i][j] - j +max(dp[i-1][k]) + k),k\le j \\ points[i][j] + j +max(dp[i-1][k])- k,k\gt j \end{cases} dp[i][j]={points[i][j]j+max(dp[i1][k])+k)kjpoints[i][j]+j+max(dp[i1][k])kk>j

此时可以考虑优化了,只要找到一行中 j j j左边 d p [ i − 1 ] [ k ] + k dp[i-1][k]+k dp[i1][k]+k的最大值和 j j j右边 d p [ i − 1 ] [ k ] − k dp[i-1][k]-k dp[i1][k]k的最大值,这个可以用两个一维数组表示,

  • m a x x 1 [ j ] maxx1[j] maxx1[j]表示 j j j左边 d p [ i − 1 ] [ k ] + k dp[i-1][k]+k dp[i1][k]+k的最大值
  • 同理可以定义 m a x x 2 [ j ] maxx2[j] maxx2[j]

这两个数组可以在计算完每行的 d p [ i ] dp[i] dp[i]进行处理,初始化处理 m a x x 1 [ j ] = j , m a x x 2 [ j ] = − j maxx1[j]=j,maxx2[j]=-j maxx1[j]=jmaxx2[j]=j
此时状态转移就变成了这样

  • d p [ i ] [ j ] = m a x ( p o i n t s [ i ] [ j ] − j + m a x x 1 [ j ] , p o i n t s [ i ] [ j ] + j + m a x x 2 [ j ] ) dp[i][j]=max(points[i][j] - j +maxx1[j], points[i][j] + j +maxx2[j]) dp[i][j]=max(points[i][j]j+maxx1[j],points[i][j]+j+maxx2[j])

注意:处理maxx2时需要从大到小遍历

代码

typedef long long LL;
class Solution {
public:int n, m;const static int N = 1e5 + 5;LL maxx1[N], maxx2[N];LL maxPoints(vector<vector<int>>& points) {n = points.size();m = points[0].size();vector<vector<LL>> dp(n + 1);for(int i = 1; i <= n; i ++ ) {dp[i].resize(m + 1);}LL res = 0;for(int j = 1; j <= m; j ++ ) {maxx1[j] = dp[1][j] + j;maxx2[j] = dp[1][j] - j;}for(int i = 1; i <= n; i ++ ) {for(int j = 1; j <= m; j ++ ) {dp[i][j] = max(points[i - 1][j - 1] - j + maxx1[j], points[i - 1][j - 1] + j + maxx2[j]);res = max(res, dp[i][j]);}LL tmax = LLONG_MIN;for(int j = 1; j <= m; j ++ ) {tmax = max(tmax, dp[i][j] + j);maxx1[j] = tmax;}tmax = LLONG_MIN;for(int j = m; j >= 1; j -- ) {tmax = max(tmax, dp[i][j] - j);maxx2[j] = tmax;}}return res;}};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis XML映射文件

XML映射文件 XML映射文件的名称与Mapper接口名称一致&#xff0c;并且将XML映射文件和Mapper接口放置在相同包下&#xff08;同包同名&#xff09;XML映射文件的namespace属性为Mapper接口全限定名一致XML映射文件中SQL语句的id与Mapper接口中的方法名一致&#xff0c;并保持返…

ICLR 2024 Spotlight|SEAL:面向真实场景超分辨率的系统性评估框架

研究背景 现实世界图像超分辨率&#xff08;Real-World Super-Resolution, Real-SR&#xff09;技术&#xff0c;作为提升图像清晰度的关键技术&#xff0c;正变得越来越重要。然而&#xff0c;如何准确评估Real-SR方法的性能&#xff0c;一直是该领域的一大挑战。目前的评估…

步步精科技诚邀您参加2024慕尼黑华南电子展

尊敬的客户&#xff1a; 我们诚挚地邀请您参加即将于2024年10月14日至10月16日在深圳国际会展中心 &#xff08;宝安新馆&#xff09;举办的慕尼黑华南电子展(electronica South China)。本届将聚焦人工智能、数据中心、新型储能、无线通信、硬件安全、新能源汽车、第三代半导…

云原生(四十四) | 远程连接ECS服务器

文章目录 远程连接ECS服务器 一、自带连接工具连接ECS云服务器 二、为什么要使用远程连接工具 三、远程连接ECS服务器四要素 1、用户名 密码 2、IP地址&#xff08;公网IP&#xff09; 3、SSH端口号 4、阿里云安全组 四、使用MobaXterm远程连接ECS云服务器 五、ECS云…

讯飞星火与昇腾AI双向奔赴:本土化技术创新应对全球化挑战的一次成功验证

文 | 智能相对论 作者 | 陈泊丞 2019年&#xff0c;彼时的AI赛道还不像今天这么热。 这一年&#xff0c;人工智能连续第三年出现在政府工作报告中&#xff0c;政策关键词从“加快”“加强”转变为“深化”&#xff0c;开始进入行业需求快速增长的应用探索期。而华为也在这个…

爬虫(反调试)

其实就是一种给页面反爬机制&#xff0c;一般页面用不到。 万能解决反调试方法&#xff1a;

vue-插槽作用域实用场景

vue-插槽作用域实用场景 1.插槽1.1 自定义列表渲染1.2 数据表格组件1.3 树形组件1.4 表单验证组件1.5 无限滚动组件 1.插槽 插槽感觉知道有这个东西&#xff0c;但是挺少用过的&#xff0c;每次看到基本都会再去看一遍用法和概念。但是在项目里&#xff0c;自己还是没有用到过…

查看 Excel 应用程序中已打开的 Excel 文件的完整路径

要查看 Excel 应用程序中已打开的 Excel 文件的完整路径&#xff08;全路径&#xff09;&#xff0c;你可以通过以下几种方法获取具体路径&#xff0c;尤其是在 VSTO 应用程序中。 方法1&#xff1a;使用 VSTO Excel 外接程序代码 在 VSTO 外接程序代码中&#xff0c;您可以直接…

海外市场充电桩需求激增:充电基础设施展望

报告显示&#xff0c;在大多数欧盟国家的路网中&#xff0c;充电桩数量存在不足、不支持快速充电且分布不均匀的问题。具体而言&#xff0c;有6个欧洲国家的平均每百公里充电桩数量不足1个&#xff0c;17个国家的平均每百公里充电桩数量少于5个&#xff0c;仅有5个国家的平均每…

计算机网络之传输层

一、传输层提供的服务 1、传输层的功能 向上面的应用层提供通信服务&#xff0c;属于面向通信的最高层&#xff0c;用户功能的最低层。传输层为运行在不同主机上的进程中间提供了逻辑通信&#xff0c;网络层提供主机之间的逻辑通信。边缘部分两台主机使用网络核心部分的功能进…

网络编程(15)——服务器如何主动退出

十五、day15 服务器主动退出一直是服务器设计必须考虑的一个方向&#xff0c;旨在能通过捕获信号使服务器安全退出。我们可以通过asio提供的信号机制绑定回调函数即可实现优雅退出。 之前服务器的主函数如下 #include "CSession.h" #include "CServer.h"…

[Git] Git下载及使用 从入门到精通 详解(附下载链接)

前言 目录 Git概述 简介 下载 Git代码托管服务 Git常用命令 Git全局配置 获取Git仓库 在本地初始化一个Git仓库 从远程仓库克隆 基本概念 工作区文件状态 本地仓库操作 远程仓库操作 分支操作 标签操作 在IDEA中使用Git 在IDEA中配置Git 本地仓库操作 远程仓…

Ngx+Lua+Redis 实时IP黑名单系统

实时黑名单系统&#xff0c;如果用php脚本实现很容易&#xff0c;但是效率惨不忍睹呀。 要想速度快还的在nginx层实现阻塞。如果iptables 层阻塞速度更快&#xff0c;但是黑名单列表如果有更新就必须要重载配置&#xff0c;实现还是有难度的。php管理后台把黑名单ip写入到redis…

万字详解AI实践,零手写编码用AI完成开发 + 数据清洗 + 数据处理 的每日新闻推荐,带你快速成为AI大神

用AIdify完成前后端开发数据处理和数据清洗。 引言数据获取和数据处理dify构建workflow进行数据清洗前端页面构建和前后端交互总结 引言 AI时代对开发人员的加强是非常明显的&#xff0c;一个开发人员可以依靠AI横跨数个自己不熟悉的领域包括前后端、算法等。让我们来做个实践…

生信初学者教程(二十八):单细胞数据标准化

文章目录 介绍加载R包导入数据消除测序深度影响评估细胞周期的影响识别高度可变的特征缩放数据降维聚类输出结果总结介绍 scRNA-seq的标准化是一个重要的预处理步骤,目的是消除技术变异(比如比如测序深度和基因长度等因素),使基因表达和/或样本之间的比较更加可靠。标准化方…

如何彻底掌握 JavaScript 23种设计模式

设计模式是解决特定问题的常用解决方案&#xff0c;它们可以帮助开发者编写更清晰、可维护、可扩展的代码。在 JavaScript 中&#xff0c;常见的设计模式可以分为三大类&#xff1a;创建型模式、结构型模式 和 行为型模式。本文将全面介绍 JavaScript 中常见的设计模式&#xf…

Java 日志打印

使用日志打印&#xff1a; private static Logger log LoggerFactory.getLogger(DeptController.class);RequestMapping("/depts")public Result list() { // System.out.println("查询全部部门数据");log.info("查询全部部门数据");ret…

pytorch 与 pytorch lightning, pytorch geometric 各个版本之间的关系

主要参考 官方的给出的意见&#xff1b; 1. pytorch 与 pytorch lightning 各个版本之间的关系 lightning 主要可以 适配多个版本的 torch; https://lightning.ai/docs/pytorch/latest/versioning.html#compatibility-matrix&#xff1b; 2. pytorch 与 pytorch geometric 各…

【AIGC】2022-NIPS-视频扩散模型

2022-NIPS-Video Diffusion Models 视频扩散模型摘要1. 引言2. 背景3. 视频扩散模型3.1. 重建引导采样以改进条件生成 4. 实验4.1. 无条件视频建模4.2. 视频预测4.3. 文本条件视频生成4.3.1 视频与图像建模的联合训练4.3.2 无分类器指导的效果4.3.3 更长序列的自回归视频扩展 5…

线程池简单原理

设置了isRun导致任务没有执行完是因为子线程在消费队列的时候的run内while循环取队列的值&#xff0c;如果isRun为flase会停掉所有线程&#xff0c;解决是不仅isRun为false还要求队列的数据10个全取出队列大小为0. 当线程池队列满的时候任务会不会丢 可以使用默认的rejectExc…