AcWing 4405. 统计子矩阵(每日一题)

news2024/11/22 5:36:16

如果你觉得这篇题解对你有用,可以点点关注再走呗~

题目描述

给定一个 N×M 的矩阵 A,请你统计有多少个子矩阵 (最小 1×1,最大 N×M) 满足子矩阵中所有数的和不超过给定的整数 K ?
输入格式

第一行包含三个整数 N,M 和 K。

之后 N 行每行包含 M 个整数,代表矩阵 A。
输出格式

一个整数代表答案。

数据范围

对于 30%
的数据,N,M≤20,
对于 70% 的数据,N,M≤100,
对于 100% 的数据,1≤N,M≤500;0≤Aij≤1000;1≤K≤2.5×108。
输入样例:

3 4 10
1 2 3 4
5 6 7 8
9 10 11 12

输出样例:

19

样例解释

满足条件的子矩阵一共有 19,包含:大小为 1×1的有 10个。
大小为 1×2的有 3个。
大小为 1×3的有 2个。
大小为 1×4的有 1个。
大小为 2×1的有 3 个。

分析

直接暴力枚举
需要枚举上、下、左、右 四个边界
时间复杂度 O(n^4) = O(10^10)
n=500 500^4=62500000000=6.25x10^10
定TLE
我们看能不能优化成三维去做?
500^3=125000000=1.25*10^8
这样看还是过不了
于是引入双指针算法枚举次数降为1.25*10^8/2
时间复杂度为**O(6*10^7)**
这样便可以过了

优化

双指针算法+前缀和
题目问满足子矩阵中所有数的和不超过给定的整数 K的子矩阵
所以我们用前缀和去处理矩阵内所有数的和
时间复杂度为**O(1)**

双指针怎么实现?

下面让我带你来分析
我们需要用到4个变量:
up(矩阵的上界)
down(矩阵的下界)
l(矩阵的左界)
r(矩阵的右界)

在这里插入图片描述

先固定上下界,现在上下界固定下来了。

在这里插入图片描述

再依次去枚举上下界,每次枚举上下界移动左右边界

在这里插入图片描述

我们需要统计的是左右边界移动的矩阵内有多少列

有多少列就有多少个满足条件的矩阵

矩阵个数r-l+1
为什么统计的是**矩阵内的列数****见盲点分析

怎么样去移动左右边界?
在这里插入图片描述

进一步--------------
在这里插入图片描述

先固定右边界,再去枚举左边界

过程分析

左边界l满足当左边界 l 到右边界 r 这一矩阵内所有数的和> K 时。
说明我们的 l~r 这块矩阵不能包含太多的数,l 需要往右移动。
l 一直移动下去,直至 l 移动到 l~r 这块矩阵的所有数的和值<= k 时,l停止

在计算完这块矩阵内列的矩阵个数后,再去移动r,依次类推。
确保每次 l~r 这块矩阵内的所有数的和均<=k
这样便可以将矩阵的个数不重不漏的计算出来。
在这里插入图片描述

注意

怕很多同学不清楚每一列(个)矩阵代表一列(个)数字
l、r也是一列矩阵,只不过为了便于理解,将l、r抽象成两条线/边界来看
其实l、r本身是一列,是有数字的!!!
下面的分析与此表述同步!
数字图如下:
在这里插入图片描述

盲点分析

为什么去枚举l~r列数
我们在枚举时枚举的并不全是向前面的图形那样
上面的图形描绘的是整体的矩阵效果,便于理解双指针的移动。

下面我们来看看枚举时的过程和细节
在这里插入图片描述

枚举的过程可以抽象看成是在一整个矩阵内拖动橙色长方形从右上往左下拉
实际上是由很多的l、r不断分割矩阵的数,见下图:
在这里插入图片描述

注:图形是便于理解,每一条线不代表一种情况,实际计算时不会重复累加。

从图中便可以看到,我们将图形理解成动态的过程,从左上到右下不断划分出小矩阵,再去判断是否满足条件,从而将矩阵的总数加起来。
像图中的蓝色小矩阵即是枚举是每一列的矩阵个数,依次移动指针,累加矩阵个数。

注意:l、r也是一列矩阵,是占据了数字的一列。

为什么计算的是列数?

在这里插入图片描述

枚举时计算的是每一列的矩阵数,这是因为我们是从右上往左下移动。
如果统计的是每一行的矩阵数则同一行的矩阵数都被并入最终的结果其中,造成结果的错漏,而从每一行去统计矩阵数也与我们枚举时移动的方向不一致,因此不能是统计每一行的矩阵数。同学们仔细想一下对不对?

关于r-l+1的由来:

先看最普遍的情况:

在这里插入图片描述

由上图:l在左边,r在右边,中间间隔3列,即3个矩阵,再加上两列其本身所在的那一列矩阵。总共是3+2=5个矩阵,代入公式检验一下,检查一下对不对?
根据图形,假设r=5,l=1,中间的列数分别为2、3、4总共3
r-l+1=5-1+1=5 结果正确!

再看边界情况:

r=l时,代入公式r-l+1=0+1=1。
得出1个,而这个便是r、l所在这一列的矩阵,见下图:
在这里插入图片描述

注:每一个矩阵代表一个数字

Accode

import java.util.*;
public class Main{
	static int N=510;
	static int [][]a=new int[N][N];
	static int [][]s=new int[N][N];
	static int n,m,k;
	public static void main(String []args) {
	Scanner sc=new Scanner(System.in);
	n=sc.nextInt();
	m=sc.nextInt();
	k=sc.nextInt();
	//预处理前缀和,便于计算矩阵内所有数的和值
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=m;j++) {
			a[i][j]=sc.nextInt();
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
					}
	}
	
	long res=0;
	//枚举上下边界
	for(int up=1;up<=n;up++) {
		for(int down=up;down<=n;down++) {
		    
			int l=1;//左边界
			int r=1;//右边界
			
			while(r<=m) {
			    //右边界在整个矩阵内
			    
				while(l<=r&&!check(up,l,down,r))l++;
				//不满足和值小于等于k则移动左边界
				
				res+=(long)r-l+1;
				//统计列数
				r++;
				//左边界固定下来,可以移动右边界
			}
			
		}
	}
	System.out.println(res);	
	}
	static boolean check(int x1,int y1,int x2,int y2) {
		//前缀和
		long sum=s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1];
		//判断是否满足sum小于等于k这一条件
		return sum<=k;
	}
}

往期回顾

不清楚蓝桥杯考什么的点点下方👇

考点秘籍

想背纯享模版的伙伴们点点下方👇

蓝桥杯省一你一定不能错过的模板大全(第一期)

蓝桥杯省一你一定不能错过的模板大全(第二期)

蓝桥杯省一你一定不能错过的模板大全(第三期)

蓝桥杯省一你一定不能错过的模板大全(第四期)!!!

想背注释模版的伙伴们点点下方👇

蓝桥杯必背第一期

蓝桥杯必背第二期

往期精彩回顾

蓝桥杯上岸每日N题 第一期(一)!!!

蓝桥杯上岸每日N题第一期(二)!!!

蓝桥杯上岸每日N题第一期(三)!!!

蓝桥杯上岸每日N题第二期(一)!!!

蓝桥杯上岸每日N题第三期(一)!!!

蓝桥杯上岸每日N题 第四期(最少刷题数)!!!

蓝桥杯上岸每日N题 第五期(山)!!!

蓝桥杯上岸每日N题 第六期(求阶乘)!!!

蓝桥杯上岸每日N题 第七期(小猫爬山)!!!

蓝桥杯上岸每日N题 第八期 (全球变暖)!!!

蓝桥杯每日N题 (消灭老鼠)

蓝桥杯每日N题(杨辉三角形)

蓝桥杯每日N题 (砝码称重)

蓝桥杯上岸每日N题(鸡尾酒)

操作系统期末题库 第九期(完结)

LeetCode Hot100 刷题(第三期)

idea创建SpringBoot项目报错解决方案

数据库SQL语句(期末冲刺)

想看JavaB组填空题的伙伴们点点下方 👇

填空题

竞赛干货

算法竞赛字符串常用操作大全

蓝桥杯上岸必刷!!!(模拟/枚举专题)

蓝桥杯上岸必背!!! (第三期 DP)

蓝桥杯上岸必背!!!(第四期DFS)

蓝桥杯上岸必背!!!(第五期BFS)

蓝桥杯上岸必背!!!(第六期树与图的遍历)

蓝桥杯上岸必背!!!(第七期 最短路算法)

蓝桥杯上岸必背!!!(第八期 简单数论)

蓝桥杯上岸必刷!!!(进制、数位专题)

蓝桥杯上岸考点清单 (冲刺版)!!!

蓝桥杯上岸必背模板 (纯享版)

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

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

相关文章

智慧展馆展厅5G+LoRa+蓝牙人员定位系统解决方案

展览业是现代高端服务业的重要组成部分&#xff0c;作为新兴的服务行业&#xff0c;展览业串联着工业、农业、商贸等诸多产业&#xff0c;能够有效拉动产业和消费增长&#xff0c;是中国发展潜力较大的行业之一。如今各个行业越来越多地举办各类展会&#xff0c;由于展馆展厅规…

人体学接口设备 (HID)

参考链接 windows-hardware drivers hid | Microsoft Learnhttps://learn.microsoft.com/pdf?urlhttps%3A%2F%2Flearn.microsoft.com%2Fzh-cn%2Fwindows-hardware%2Fdrivers%2Fhid%2Ftoc.json人体学接口设备 (HID) 简介 - Windows drivers | Microsoft Learnhttps://learn.mi…

遇到 Binder这些面试题,你会怎么答?

作为开发人员&#xff0c;每个人都有每个人擅长领域&#xff0c;自然也有自己不擅长的领域&#xff0c;很难成为完美的一个全栈开发。在面试中最怕遇见的一件事是面试官专挑你不擅长的领域进行提问&#xff0c;目的就是看你遇到问题的应变能力。 接下给大家分享一个面试中容易被…

CUDA小白 - NPP(3) 图像处理 Color and Sampling Conversion

cuda小白 原始API链接 NPP GPU架构近些年也有不少的变化&#xff0c;具体的可以参考别的博主的介绍&#xff0c;都比较详细。还有一些cuda中的专有名词的含义&#xff0c;可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》 常见的NppStatus&#xf…

标准库STL容器使用值语义

C自学精简实践教程 目录(必读) 标准库STL的容器都是值语义的。 即&#xff0c;无法将一个变量放到容器里。容器里存放的只是我们放进去的变量的拷贝&#xff08;副本&#xff09;。 示例&#xff1a; #include <iostream> #include <vector> using namespace s…

【Apollo学习笔记】——规划模块TASK之RULE_BASED_STOP_DECIDER

文章目录 前言RULE_BASED_STOP_DECIDER相关配置RULE_BASED_STOP_DECIDER总体流程StopOnSidePassCheckClearDoneCheckSidePassStopIsPerceptionBlockedIsClearToChangeLaneCheckSidePassStopBuildStopDecisionELSE:涉及到的一些其他函数NormalizeAngleSelfRotate CheckLaneChang…

创建python环境——Anaconda

在Windows中安装Anaconda和简单使用 一.Anaconda发行概述 Anaconda是一个可以便捷获取和管理包&#xff0c;同时对环境进行统一管理的发行版本&#xff0c;它包含了conda、 Python在内的超过180个科学包及其依赖项。 1.Anaconda发行版本具有以下特点&#xff1a; (1)包含了…

Qt实现一个简单的放射式弹出菜单

Qt实现一个简单的放射式弹出菜单 实现效果&#xff1a; GitHub源码 支持特性 可设置弹出选项的起始角度与角度范围 按住中心按钮&#xff0c;可以拖拽窗口 动画支持&#xff0c;可以设置动画时间、选项的延迟弹出 设置菜单的布局对齐、边距&#xff0c;方便根据场景放置在…

YOLO目标检测——蔬菜检测数据集下载分享

YOLO蔬菜检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;图片格式为jpg&#xff0c;共21000张图片。 数据集点击下载&#xff1a;YOLO蔬菜检测数据集21000图片数据说明.rar

科研无人机平台P600进阶版,突破科研难题!

随着无人机技术日益成熟&#xff0c;无人机的应用领域不断扩大&#xff0c;对无人机研发的需求也在不断增加。然而&#xff0c;许多开发人员面临着无法从零开始构建无人机的时间和精力压力&#xff0c;同时也缺乏适合的软件平台来支持他们的开发工作。为了解决这个问题&#xf…

7.Redis-list

list list常用命令lpushlrangelpushxrpushrpushxlpop / rpoplindexlinsertllenlremltrimlset 阻塞版本命令blpop/brpop 总结内部编码应用场景使用redis作为消息队列 redis中的 list 是一个双端队列, list 相当于是数组或者顺序表。list 并非是一个简单的数组&#xff0c;而是更…

matlab使用教程(29)—微分方程实例

此示例说明如何使用 MATLAB 构造几种不同类型的微分方程并求解。MATLAB 提供了多种数值算法来求解各种微分方程&#xff1a; 1.初始值问题 vanderpoldemo 是用于定义 van der Pol 方程的函数 type vanderpoldemo function dydt vanderpoldemo(t,y,Mu) %VANDERPOLDEMO Defin…

UDP协议的重要知识点

UDP&#xff0c;即用户数据报协议&#xff08;User Datagram Protocol&#xff09;&#xff0c;是一个简单的无连接的传输层协议。与TCP相比&#xff0c;UDP提供了更少的错误检查机制&#xff0c;并允许数据包在网络上更快地传输。在这篇博客中&#xff0c;我们将深入探讨UDP的…

【请求报错:javax.net.ssl.SSLHandshakeException: No appropriate protocol】

1、问题描述 在请求服务时报错说SSL握手异常协议禁用啥的 javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)2、解决方法 在网上查找了方法原因后得知是jdk的问题 修改java.security 文件 Linu…

UG\NX二次开发BlockUI 进入NX的BlockUI编辑界面

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: 要使用BlockUI,需要先进入NX的BlockUI编辑界面。在低版本中,可以在Toolbar工具条中进入开始→所有应用模块→块UI样式编辑器;在高版本中,可以在Ribbon工具栏…

iframe如何用?常见的一些套路

文章目录 &#x1f30a;什么是iframe我们来看一个demoiframe的常用属性iframe的优缺点 &#x1f30a;点击劫持和安全策略&#x1f30a;postMessage通信postMessage &#x1f30a;iframe如何解决跨域资源链接 &#x1f30a;什么是iframe iframe 标签规定一个内联框架。内联框架…

阿里云轻量应用服务器Linux-Centos7下Oracle19c的配置

初始环境&#xff1a;阿里云轻量应用服务器已经安装Oracle19c 具体目标&#xff1a;配置Oracle Database 19c 目录 第一步&#xff1a;切换到Oracle命令行第二步&#xff1a;新建用户和表空间第三步&#xff1a;切换用户第四步&#xff1a;在当前用户下创建一些表第五步&#x…

自动驾驶和辅助驾驶系统的概念性架构(一)

摘要&#xff1a; 本文主要介绍包括功能模块图&#xff0c;涵盖了底层计算单元、示例工作负载和行业标准。 前言 本文档参考自动驾驶计算联盟(Autonomous Vehicle Computing Consortium)关于自动驾驶和辅助驾驶计算系统的概念系统架构。 该架构旨在与SAE L1-L5级别的自动驾驶保…

[Pandas] pandas.melt

melt是溶解 / 分解的意思&#xff0c;即拆分数据 melt()函数可以将一些列的内容进行合并&#xff0c;把宽表整合成长表 语法格式 pandas.melt(frame, id_varsNone, value_varsNone, var_nameNone, value_namevalue)参数说明 frame&#xff1a;要处理的数据集 id_vars&#…

超时取消订单

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…