AcWing 4405. 统计子矩阵:做题笔记

news2024/11/29 3:02:27

目录

暴力思路 

代码

前缀和+双指针

代码

解释

推荐博客


这道题的主要思路就是枚举所有的子矩阵,判断符合条件的子矩阵的个数。

暴力思路 

我服了,其实我最开始没有想到 :枚举所有的子矩阵 这样一个很有总结性的要点。

我是想着哦我先知道这道题是考二维前缀和的,然后与模板不同的是,这里并没有给出(额也不算没有给出吧)一维前缀和里面 l r 边界中的 l, 这样形容可以理解嘛?像激光炸弹那道题里:

这句话就是给出了左上角的点,我们知道二维前缀和求某个子矩阵的和就是用前缀和数组中右下角-左上角。 

但这道题里没有直接说,我看样例解释之后明白他是需要遍历所有1*1/1*2/...2*1/2*2...,这样,然后我觉得在正常的求某个子矩阵的和的基础上,需要在原来的两层循环内在遍历(1*1/1*2/...2*1/2*2...)这些所有的可能,然后就套了4层循环。写了暴力。

我的暴力是这样写出来的😂哎甚至是暴力都写得很艰难啊🥀🤣

代码

#include<iostream>
#include<algorithm>
using namespace std;
const int N=510;
int q[N][N];
int n,m,k;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin>>n>>m>>k;
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>q[i][j];
			q[i][j]+=q[i-1][j]+q[i][j-1]-q[i-1][j-1];
			//cout<<q[i][j]<<" ";
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			for(int z=1;z<=i;z++)
			{
				for(int y=1;y<=j;y++)
				{
					int t=q[i][j]-q[z-1][j]-q[i][y-1]+q[z-1][y-1];
				
					if(t<=k)
					{
						cnt++;
					}
				}
			}
		}
	}
	cout<<cnt;
	return 0;
}

因为写了四层循环,500^4,肯定会超时了。

这样是能过6/10个数据,真比赛写到这就算了吧😂别的我也写不出来doge(流下了苦涩的眼泪😂)

前缀和+双指针

这个先看代码把

代码

#include<iostream>
#include<algorithm>
using namespace std;
const int N=510;
int n,m,k;
int q[N][N];
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>q[i][j];
			q[i][j]+=q[i-1][j];//计算出每一列的前缀和矩阵 
		}
	}
	long long cnt=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=i;j<=n;j++)//枚举上下边界 
		{
			for(int l=1,r=1,sum=0;r<=m;r++)//左右边界的滑动窗口 
			{
				//当符合题目所说的<=k时,我们就拓宽右边界 
				sum+=q[j][r]-q[i-1][r];//添加上r边界端点的子矩阵的和 
				//不符合的时候,我们就要把左边界向右移动 
				while(sum>k)
				{
					sum-=q[j][l]-q[i-1][l];//减去移出去的左端点处的和
					l++;
				}
				//每次窗口的移动所得到的满足条件子矩阵的个数 =右边界 r 减去左边界 l 再加上 1
				cnt+=r-l+1;
			}
		}
	 } 
	cout<<cnt;
	return 0;
}

解释

这里我们的思路是:

计算出这个二维矩阵每一列的前缀和的二维矩阵

我们可以把这个二维矩阵的每一列 看作 一维前缀和数组中的每一位数字,这个数字实际代表的是一列的前缀和。

我们想要判断这个一维数组所有的子区间是否符合题目条件,

①要么我们暴力枚举所有的子区间:

// 如果计算a数组所有子区间的和,p数组为其预处理出的前缀和
//(这里用前缀和算是为了简写,主要突出两种写法大框架上的区别,否则最内层还有一层计算子区间和的循环)

for(int l=1; l<=n; l++)
{
    for(int r=i; r<=n; r++)
    {
        sum=p[r]-p[l-1];
        // 按题目要求对 sum 进行判断
    }
}

在暴力枚举的方法中,我们需要枚举所有可能的子区间,然后对每个子区间进行检查。这通常需要两层循环,第一层循环枚举子区间的起始位置,第二层循环枚举子区间的结束位置。然后在这两层循环内部,我们计算子区间的和,并进行判断。 

②要么就是利用滑动窗口:

int l = 1, r = 1, sum = 0;

// 使用 for 循环遍历数组
for (r= 1; r < n; r++) {
    // 将右边界的元素加入窗口
    sum += a[r];
    // 使用 while 循环移动左边界,直到窗口内的和满足条件
    while (sum > k && l < r) {
        sum -= a[l];
        l++;
    }
    //对窗口内的和进行判断
}

让这个窗口在数组上滑动,每次滑动都会有一个元素进入窗口,同时有一个元素离开窗口。通过这种方式,我们可以在每次窗口滑动时,快速地更新窗口内的信息,而不需要对整个窗口进行重新计算。

(暴力和滑动窗口的区别主要在外层的两个循环上,而不在于计算这些和上,因为是正是由于外层的两层循环才导致了重复计算的和。)

在每一种确定的上下边界里,通过滑动窗口调整左右边界,这样就把两层循环降成一层。

因此我们每次对这个一维数组的边界的变动就会构成 r-l+1 个不同的子矩阵

我们拓宽右边界,也就是把右端点添加到序列中,从 l~r 的每一个元素加上了 r 都形成了一个新的子区间,在二维里也就是都形成了一个新的子矩阵。因此新增加的包含该列的新的子矩阵的数量就是r-l+1即区间内元素数量

我们在最外层需要有两个for循环一层 i 循环掌管上边界,一层 j 循环掌管下边界,这个下边界是>=上边界的,因此它的初值可以直接从 i 开始。这样就保证了遍历到所有的子矩阵

推荐博客

蓝桥杯2022年第十三届省赛真题-统计子矩阵

我刚开始一直不明白怎么回事,看了这个博主的注释一下清晰了。 推荐看一下


写到这里,感觉好难啊呜呜🥀🥀看了超长时间才理解了优化的

有问题欢迎指出,一起加油!!!

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

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

相关文章

Mysql数据库:MHA高可用架构

目录 前言 一、MHA概述 1、什么是MHA 2、MHA的特点 3、MHA的组成 4、MHA的工作原理 5、故障切换备选主库的算法 二、部署MHA高可用架构 1、环境部署 2、部署主从同步 2.1 修改主配置文件并创建软链接 2.1.1 master 修改主配置文件并创建软连接 2.1.2 slave1 修改主…

WIFI驱动移植实验:将 rtl8188EUS驱动添加到 Linux 内核中

一. 简介 正点原子的 I.MX6U-ALPHA 开发板目前支持两种接口的 WIFI &#xff1a; USB 和 SDIO &#xff0c;其中 USB接口的WIFI 使用使用的芯片为 RTL8188EUS 或 RTL8188CUS &#xff0c; SDIO 接口的 WIFI 使用芯片为 RTL8189FS &#xff0c;也叫做 RTL8189FT…

尚医通day1

1 创建项目 doc 窗口 pnpm create vite 填写项目名 vue-syt选择框架 vuetypeScript 2整理项目 删除 /src/assets/vue.svg 文件&#xff0c;删除 /src/components 下的 helloWorld.vue删除app.vue内容&#xff0c;快捷键v3ts 生成模板内容去掉 /src/style.css 样式文件&…

仿微信领红包HTML源码

源码介绍 仿微信领红包HTML源码&#xff0c;将代码放到一个空白的HTML文件里面保存&#xff0c;鼠标双击即可查看效果&#xff0c;一个微信发送消息提示&#xff0c;弹窗就出来了&#xff0c;关闭之后&#xff0c;出现完整的微信红包领取界面&#xff0c;源码HTML&#xff0c;…

GS1-全球分类标准

GS1 GS1是一个中立的全球合作平台&#xff0c;汇集行业领袖、政府、监管机构、学术界和协会&#xff0c;共同开发基于标准的解决方案&#xff0c;以应对数据交换的挑战。我们的规模和影响力——遍布 116 个国家/地区的当地会员组织、超过 200 万家用户公司和每天 100 亿笔交易—…

conda 创建 python3.10.12 环境

conda 创建 python3.10.12 环境 介绍使用前置条件&#xff1a;安装 conda配置环境变量验证 Conda 安装结果创建环境&#xff1a;python激活 Anaconda 环境 验证 Python 版本。 介绍 Conda是一个开源的包管理和环境管理系统&#xff0c;由Continuum Analytics公司开发。它可以安…

LangChain使用实例——Query analysis

Query analysis ​ “Search”为许多用例提供支持——包括检索增强生成的“检索”部分。最简单的方法是将用户问题直接传递给检索器。为了提高性能&#xff0c;还可以使用“query analysis”以某种方式“优化”查询。传统上&#xff0c;这是通过基于规则的技术来完成的&#x…

VMware虚拟机共享主机v2rayN

目录 &#x1f33c;前言 &#x1f33c;解释 &#x1f6a9;操作 1&#xff09;VMware -- 虚拟网络编辑器 2&#xff09;VMware -- 网络适配器 3&#xff09;主机 IP 地址 4&#xff09;v2rayN 代理端口 5&#xff09;VMware -- 网络代理(Network proxy) &#x1f382;结…

基于 Quartz.NET 可视化任务调度平台 QuartzUI

一、简介 QuartzUI 是基于 Quartz.NET3.0 的定时任务 Web 可视化管理&#xff0c;Docker 打包开箱即用、内置 SQLite 持久化、语言无关、业务代码零污染、支持 RESTful 风格接口、傻瓜式配置、异常请求邮件通知等。 二、部署 QuartzUI 从 2022 年到现在没有提交记录&#xf…

深入理解MapReduce:从Map到Reduce的工作原理解析

当谈到分布式计算和大数据处理时&#xff0c;MapReduce是一个经典的范例。它是一种编程模型和处理框架&#xff0c;用于在大规模数据集上并行运行计算任务。MapReduce包含三个主要阶段&#xff1a;Map、Shuffle 和 Reduce。 ** Map 阶段 ** Map 阶段是 MapReduce 的第一步&am…

初始Java篇(JavaSE基础语法)(5)(类和对象(上))

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 面向对象的初步认知 面向对象与面向过程的区别 类的定义和使用 类的定义格式 类的实例化 this引用 什么是this引用&#xff1f; this引用…

六、Django开发

六、Django开发 1.新建项目2.创建app2.1 第一种方法&#xff1a;2.2 利用pycharm中tools工具直接创建app 3.设计表结构&#xff08;django&#xff09;4.在MySQL中生成表5.静态文件管理6.部门管理6.1 部门列表 7.模板的继承8.用户管理8.1初识Form1.views.py2.user_add.html 8.2…

数字乡村发展蓝图:科技赋能农村实现全面振兴

目录 一、数字乡村发展蓝图的内涵与目标 二、科技赋能农村&#xff1a;数字乡村发展的动力与路径 &#xff08;一&#xff09;加强农业科技创新&#xff0c;提升农业生产效率 &#xff08;二&#xff09;推进农村电商发展&#xff0c;拓宽农民增收渠道 &#xff08;三&…

数据挖掘入门项目二手交易车价格预测之特征工程

文章目录 目标常见的特征工程具体步骤1. 导入数据2. 删除异常值3. 特征构造3.1 为树模型构造特征3.2 为LR NN 之类的模型构造特征 4. 特征筛选过滤式包裹式嵌入式 5. 总结 本文数据集来自阿里天池&#xff1a;https://tianchi.aliyun.com/competition/entrance/231784/informat…

华为OD机试 - 绘图机器 - 双指针(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

Spring Boot 一.基础和项目搭建(上)

之前也自学过SSM框架&#xff0c;Spring Boot框架&#xff0c;也动手写过几个项目&#xff0c;但是这是第一次完整的记录。从0开始&#xff0c;把一些细节整理了一下。 大概会分为十几小节&#xff0c;这是一个学习的过程&#xff0c;更是一个思考的过程&#xff0c;废话不多说…

MySQL8 搭建集群方案文档

MySQL8.0.21 InnoDB Cluster 从零搭建集群方案详细文档 InnoDB集群 本文档分享新版本MySQL 8.0.21 Innodb Cluster集群搭建过程 ~ MySQL InnoDB Cluster为MySQL提供了完整的高可用性解决方案。通过使用MySQL Shell附带的AdminAPI&#xff0c; 您可以轻松地配置和管理一组至少…

【数字IC/FPGA】手撕代码:模3检测器(判断输入序列能否被3整除)

今天我们来手撕一个常见的笔试题&#xff0c;使用的方法是三段式Moore状态机。 题目描述&#xff1a; 输入端口是串行的1bit数据&#xff0c;每个时钟周期进来一位新数据后&#xff0c;实时检查当前序列是否能整除3&#xff0c;若能则输出1&#xff0c;否则输出0。 例如&#…

BIT-4-自定义类型:结构体,枚举,联合(C语言进阶)

本章重点 结构体 结构体类型的声明结构的自引用结构体变量的定义和初始化结构体内存对齐结构体传参结构体实现位段&#xff08;位段的填充&可移植性&#xff09;枚举 枚举类型的定义枚举的优点枚举的使用联合 联合类型的定义联合的特点联合大小的计算 结构体 1.结构体的声…

unity学习(74)——服务器Dispose异常

1.返回的1 2 11是怪物初始化&#xff0c;源代码中也没有 2. 3.客户端中的网络连接初始化如下&#xff1a; 4.不是因为超时&#xff0c;设置10s为超时期限后&#xff0c;客户端和服务器有时依然会报错&#xff01; 5.我感觉就是update中发包给弄坏的&#xff01; 6.不在“帧”…