统计子矩阵(前缀和+双指针)

题目描述

给定一个 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 ≤ Ai j ≤ 1000; 1 ≤ K ≤ 250000000.

可以用二维前缀和暴力去写 过70%样例

cpp 复制代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#define int long long
using namespace std;
const int N=500;
int a[N][N];
int s[N][N];
signed main()
{
	int n,m,k;cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++) cin>>a[i][j];
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			s[i][j]=s[i-1][j]+s[i][j-1]+a[i][j]-s[i-1][j-1];
		}
	}
	int sum=0;
	for(int x1=1;x1<=n;x1++)
	{
		for(int y1=1;y1<=m;y1++)
		{
			for(int x2=x1;x2<=n;x2++)
			{
				for(int y2=y1;y2<=m;y2++)
				{
					if(s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<=k) sum++;
					else break;
				}
			}
		}
	}
	cout<<sum<<endl;
    return 0;
}

一维前缀和+双指针-->该题跟 在一组数中 问能有多少个区间之和小于k 的做法类似

cpp 复制代码
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int N=550;
int a[N][N];
int s[N][N];
signed main()
{
	int n,m,k;cin>>n>>m>>k;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
			//计算列的前缀和--一维前缀和
			s[i][j]=a[i][j]+s[i-1][j];
		}
	}
	int ans=0;
	for(int i=1;i<=n;i++)//上边界
	{
		for(int i1=i;i1<=n;i1++)//下边界
	    {
	    	for(int l=1,r=1,sum=0;r<=m;r++)
	    	{
	    		sum+=s[i1][r]-s[i-1][r];//确定右边界
	    	
	    		while(sum>k)
	    		{
	    			sum-=s[i1][l]-s[i-1][l];//求符合条件的左边界
	    			l++;
				}
			
				ans+=r-l+1;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
相关推荐
吃好睡好便好7 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅7 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
2601_957787588 小时前
矩阵运营的技术底座:为什么“一体化系统“正在取代“工具拼装“
人工智能·矩阵·矩阵运营
x_yeyue9 小时前
三角形数
笔记·算法·数论·组合数学
念何架构之路10 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星10 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑10 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光11 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩11 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_6294947312 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表