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

目录

暴力思路 

代码

前缀和+双指针

代码

解释

推荐博客


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

暴力思路 

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

我是想着哦我先知道这道题是考二维前缀和的,然后与模板不同的是,这里并没有给出(额也不算没有给出吧)一维前缀和里面 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 再加上 1cnt+=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.rhkb.cn/news/296586.html

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

相关文章

【深度学习|Pytorch】torchvision.datasets.ImageFolder详解

ImageFolder详解 1、数据准备2、ImageFolder类的定义transforms.ToTensor()解析 3、ImageFolder返回对象 1、数据准备 创建一个文件夹&#xff0c;比如叫dataset&#xff0c;将cat和dog文件夹都放在dataset文件夹路径下&#xff1a; 2、ImageFolder类的定义 class ImageFol…

【系统架构师】-软件架构评估

1、质量属性 1、性能 系统的响应能力&#xff0c;响应时间、吞吐量&#xff0c; 策略&#xff1a;优先级队列、资源调度 2、可用性 系统正常运行的时间比例&#xff08;两次故障之间的时间长度&#xff09;&#xff0c;故障间隔时间&#xff0c; 策略&#xff1a;冗余、心…

AI预测福彩3D第26弹【2024年4月4日预测--第4套算法重新开始计算第11次测试】

今天清明节假日&#xff0c;一会要外出&#xff0c;可能要晚点回来。咱们尽早先把预测数据跑完&#xff0c;把结果发出来供各位彩友参考。合并下算法&#xff0c;3D的预测以后将重点测试本套算法&#xff0c;因为本套算法的命中率较高。以后有时间的话会在第二篇文章中发布排列…

UniApp 应用发布到苹果商店指南

&#x1f680; 想要让你的 UniApp 应用在苹果商店亮相吗&#xff1f;别着急&#xff0c;让我来带你一步步完成这个重要的任务吧&#xff01;在这篇博客中&#xff0c;我将详细介绍如何将 UniApp 应用顺利发布到苹果商店&#xff0c;让你的应用跻身于苹果生态之中。 引言 &…

2024年泰迪杯数据挖掘B题详细思路代码文章教程

目前b题已全部更新包含详细的代码模型和文章&#xff0c;本文也给出了结果展示和使用模型说明。 同时文章最下方包含详细的视频教学获取方式&#xff0c;手把手保姆级&#xff0c;模型高精度&#xff0c;结果有保障&#xff01; 分析&#xff1a; 本题待解决问题 目标&#…

Linux基础篇:VMware centos7虚拟机网络配置——桥接模式

VMware centos7虚拟机网络配置——桥接模式 1 搞清楚什么是桥接模式 桥接模式允许虚拟机直接连接到物理网络&#xff0c;就像它是物理网络中的一个独立设备一样。在这种模式下&#xff0c;虚拟机将具有与宿主机相同网络中的其他设备相同的网络访问权限。虚拟机将获得一个独立…

css心跳动画

图标引入 <img class"icon" src"heart.svg" alt"" srcset""> CSS代码 <style>.icon {animation:bpm 1s linear,pulse 0.75s 1s linear infinite;}keyframes pulse {from,75%,to {transform: scale(1);}25% {transform:…

RocketMQ(版本4.9.4)+RocketMQ_Dashbord环境搭建(生产者、消费者的前置环境搭建)

一、官方网站下载 RocketMQ源码包 https://rocketmq.apache.org/zh/docs/4.x/introduction/02quickstart 二、把rocketMQ上传到Linux环境下解压&#xff0c;编译&#xff0c;执行以下命令&#xff08;需要提前装jdk和maven并配置好环境变量&#xff09; unzip rocketmq-all-4…

Postman和Python Request测试多行Form-data

1、请求参数有多个&#xff0c;F12查看请求体如下&#xff1a; 查看源代码&#xff1a; ------WebKitFormBoundaryHknGXm9VkhRUXZYC Content-Disposition: form-data; name"custId"IICON004 ------WebKitFormBoundaryHknGXm9VkhRUXZYC Content-Disposition: form-da…

强大缓存清理工具 NetShred X for Mac激活版

NetShred X for Mac是一款专为Mac用户设计的强大缓存清理工具&#xff0c;旨在帮助用户轻松管理和优化系统性能。这款软件拥有直观易用的界面&#xff0c;即使是初次使用的用户也能快速上手。 软件下载&#xff1a;NetShred X for Mac激活版下载 NetShred X能够深入扫描Mac系统…

Golang | Leetcode Golang题解之第7题整数反转

题目&#xff1a; 题解&#xff1a; func reverse(x int) (rev int) {for x ! 0 {if rev < math.MinInt32/10 || rev > math.MaxInt32/10 {return 0}digit : x % 10x / 10rev rev*10 digit}return }

doccano标注工具|为机器学习建模做数据标注

目录 一、标记流程 二、配置环境 2.1 安装 2.2 运行doccano 三、案例 3.1 创建项目 3.2 上传数据 3.3 定义标签 3.4 添加成员 3.5 开始标注 3.6 导出数据 3.7 导出数据 doccano doccano是开源的数据…

软件测试用例(2)

具体的设计方法 -- 黑盒测试 因果图 因果图是一种简化的逻辑图, 能直观地表明程序的输入条件(原因)和输出动作(结果)之间的相互关系. 因果图法是借助图形来设计测试用例的一种系统方法, 特别适用于被测试程序具有多种输入条件, 程序的输出又依赖于输入条件的各种情况. 因果图…

【深度学习】sdwebui的token_counter,update_token_counter,如何超出77个token的限制?对提示词加权的底层实现

文章目录 前言关于token_counter关于class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing)如何超出77个token的限制&#xff1f;对提示词加权的底层实现Overcoming the 77 token limit in diffusers方法1 手动拼方法2 compel 问询、帮助请看&#xff1a; 前言 …

MyBatis的基本应用

源码地址 01.MyBatis环境搭建 添加MyBatis的坐标 <!--mybatis坐标--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><!--mysql驱动坐…

【C语言】联合和枚举

个人主页点这里~ 联合和枚举 一、联合体1、联合体类型的声明2、联合体成员的特点3、与结构体对比4、计算联合体大小 二、枚举1、枚举的声明2、枚举的优点3、枚举类型的使用 一、联合体 1、联合体类型的声明 联合体的定义与结构体相似&#xff0c;但是联合体往往会节省更多的空…

【科研笔记】知识星球不可选择内容爬虫

知识星球不可选择内容爬虫 1 背景2 实现3 拓展遗留问题1 背景 针对与知识星球中,电脑打开网页不可选择复制粘贴的问题,进行爬虫处理,获取网页的内容,并保存在本地 2 实现 需要下载python,和爬虫的第三方库selenium,可以查看博客中有关selenium的内容进行回顾。当前使用…

Compose 中状重组

一、状态变化 1.1 状态变化是什么 根据上篇文章的讲解&#xff0c;在 Compose 我们使用 State 来声明一个状态&#xff0c;当状态发生变化时&#xff0c;则会触发重组。那么状态变化是指什么呢&#xff1f; 下面我们来看一个例子&#xff1a; Composable fun NumList() {val…

非比较排序之计数排序

思想&#xff1a; 比较排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。 思想步骤&#xff1a; 统计相同元素出现的次数根据统计的结果将序列收回到原来的序列中 具体步骤&#xff1a; 先统计数据的大小范围&#xff0c;开辟一个大小为范围的数组( 最大值 -…

世优科技上榜2024年度《中国虚拟数字人影响力指数报告》

日前&#xff0c;第三期《中国虚拟数字人影响力指数报告》在中国网络视听大会上正式发布。本期《报告》由中国传媒大学媒体融合与传播国家重点实验室&#xff08;以下简称“国重实验室”&#xff09;、中国传媒大学数字人研究院编制&#xff0c;中国网络视听协会、人民日报智慧…