蓝桥 2109统计子矩阵

server/2025/3/17 3:18:27/

问题描述

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

输入格式

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

之后 N 行每行包含 M 个整数, 代表矩阵 A.

输出格式

一个整数代表答案。

样例输入

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 个。

评测用例规模与约定

对于 30% 的数据, N,M≤20.

对于 70% 的数据, N,M≤100.

对于 100% 的数据, 1≤N,M≤500; 0≤Aij≤1000; 1≤K≤250000000

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

方法1:暴力(70分)

枚举每个点为起点,枚举每个点为终点,这样就可以得到所有的子矩阵,但时间复杂度是O(n^4),会超时

#include <iostream>
using namespace std;int n, m, k;
int a[510][510];
long long ans;int main() 
{cin >> n >> m >> k;for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {cin >> a[i][j];//二维前缀和,第i行j列格子左上部分所有元素的和a[i][j] = a[i][j] + a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];}}//外层两重循环 (i 和 j) 遍历所有可能的左上角位置for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {//内层两重循环 (l 和 p) 遍历所有可能的右下角位置//l >= i 且 p >= jfor (int l = i; l <= n; ++l) {for (int p = j; p <= m; ++p) {//以(i, j)为左上角,(l, p)为右下角的子矩阵的和为:int sum = a[l][p] - a[l][j - 1] - a[i - 1][p] + a[i - 1][j - 1];if (sum <= k) ans++;}}}}cout << ans;return 0;
}

方法2:前缀和   二维滑动窗口

i,j分别表示一个区域的左右边界,p,q来表示上下两个指针,p一开始在最上面,不断向下来找q,直到权值和小于等于k(而且不能越界也就是p>q),然后p q这片区域的行数q-p+1就是子矩阵的个数

 

#include<iostream>
using namespace std;int n, m, k;
int a[510][510];
long long ans;int main() 
{cin >> n >> m >> k;for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {scanf("%d", &a[i][j]);//二维前缀和,第i行j列格子左上部分所有元素的和a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];}}for (int i = 1; i <= m; ++i) {for (int j = i; j <= m; ++j) {for (int p = 1, q = 1; q <= n; ++q) {//以(p, i)为左上角,(q, j)为右下角的子矩阵的和>kwhile (p <= q && a[q][j] - a[q][i - 1] - a[p - 1][j] + a[p - 1][i - 1] > k) {//一直让p指针下移到权值和<=kp++;}if (p <= q) {//在当前i,j的情况下,此时p q 之间的所有子矩阵都满足条件,一共q-p+1行ans += (q - p + 1);}}}}cout << ans;return 0;
}

 


http://www.ppmy.cn/server/175596.html

相关文章

DeepSeek-R1深度解读

deepseek提出了一种通过强化学习&#xff08;RL&#xff09;激励大语言模型&#xff08;LLMs&#xff09;推理能力的方法&#xff0c;个人认为最让人兴奋的点是&#xff1a;通过RL发现了一个叫“Aha Moment”的现象&#xff0c;这个时刻发生在模型的中间版本中。在这个阶段&…

LeetCode --- 440周赛

题目列表 3477. 将水果放入篮子 II 3478. 选出和最大的 K 个元素 3479. 将水果装入篮子 III 3480. 删除一个冲突对后最大子数组数目 一、将水果放入篮子 II 本题由于数据范围比较小&#xff0c;所以我们可以暴力模拟水果的放置过程&#xff0c;代码如下 // C class Solution…

05延迟任务精准发布文章(redis实现延迟任务、分布式锁)

上架不代表发布(需要发布app端才会显示文章&#xff09; 1)文章定时发布 2)延迟任务概述 2.1)什么是延迟任务 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间 延迟队列&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在…

新矩阵(信息学奥赛一本通-2041)

【题目描述】 已知一个nn(2≤n≤20)的矩阵&#xff08;方阵&#xff09;&#xff0c;把矩阵二条对角线上的元素值加上10&#xff0c;然后输出这个新矩阵。 【输入】 第一行为n; 下面为一个nn&#xff0c;矩阵中各正整数小于100。 【输出】 输出新的矩阵。共n行&#xff0c;每行…

聊聊langchain4j的AiServicesAutoConfig

序 本文主要研究一下langchain4j-spring-boot-starter的AiServicesAutoConfig LangChain4jAutoConfig dev/langchain4j/spring/LangChain4jAutoConfig.java AutoConfiguration Import({AiServicesAutoConfig.class,RagAutoConfig.class,AiServiceScannerProcessor.class })…

金融时间序列分析(Yahoo Finance API实战)

这里写目录标题 金融时间序列分析(Yahoo Finance API实战)1. 引言2. 项目背景与意义3. 数据集介绍4. GPU加速在数据处理中的应用5. 交互式GUI设计与加速处理6. 系统整体架构7. 数学公式与指标计算8. 完整代码实现9. 代码自查与BUG排查10. 总结与展望金融时间序列分析(Yahoo …

centos7通过yum安装redis

centos7通过yum安装redis 1.安装redis数据库 yum install -y redis2.启动redis服务 systemctl start redis3.查看redis状态 systemctl status redis4、停止服务 systemctl stop redis5、重启服务 systemctl restart redis6、查看redis进程 ps -ef | grep redis7、开放端…

JVM常用概念之超态虚拟调用

问题 超态虚拟调用是什么? 基础知识 大部分认为超态调用是非常糟糕的&#xff0c;主要是因为超态调用会调用慢路径&#xff0c;并且无法享受编译器优化&#xff0c;那OpenJDK可以取消超态调用吗?那在发生超态调用时我们可以做什么呢? 实验 源码 import org.openjdk.jm…