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

题目链接:

代码思路:

①枚举上、下边界。

②求每一列前缀和。

②固定上下边界后,在通过双指针确定子矩阵的左右边界。双指针维护一个窗口 [l, r],确保窗口中所有列的和(下面前缀和-上面前缀和)不超过 K。通过滑动窗口方式,计算出以r为右端点的所有子矩阵的有效数量,也就是 子矩阵数量=r - l + 1;

代码如下:

cpp 复制代码
#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 550;

int n, m, k;
int g[N][N];
//前缀和 竖
int s[N][N];
//答案
int ans;

signed main(){
    //读入
    cin >> n >> m >> k;
    for(int i = 1;  i<= n; i++){
        for(int j = 1; j <= m; j++){
            cin >> g[i][j];
            //计算前缀和
            s[i][j] = s[i-1][j] + g[i][j];
        }
    }
    
    //枚举 上 下 边界
    for(int i = 1; i <= n; i++){
        for(int j = i; j <= n; j++){
            //定义双指针
            int l = 1, sum = 0;
            for(int  r = 1; r <= m; r++){
                //加上 r 这一列
                sum += s[j][r] - s[i-1][r];
                //当sum>k
                while(sum > k){
                    //减去l那一列
                    sum -= s[j][l] - s[i-1][l];
                    l++;
                }
                //加上这个区间所有符合的矩阵数
                ans += r-l+1;
            }
        }
    }
    cout << ans << endl;
    return 0;
}
相关推荐
十八岁讨厌编程17 小时前
【算法训练营 · 补充】LeetCode Hot100(上)
算法·leetcode
一条星星鱼17 小时前
从0到1:如何用统计学“看透”不同睡眠PSG数据集的差异(域偏差分析实战)
人工智能·深度学习·算法·概率论·归一化·睡眠psg
浮灯Foden17 小时前
算法-每日一题(DAY18)多数元素
开发语言·数据结构·c++·算法·leetcode·面试
小欣加油17 小时前
leetcode 844 比较含退格的字符串
算法·leetcode·职场和发展
小龙报17 小时前
《算法每日一题(1)--- 第31场蓝桥算法挑战赛》
c语言·开发语言·c++·git·算法·学习方法
llz_11218 小时前
五子棋小游戏
开发语言·c++·算法
如竟没有火炬18 小时前
全排列——交换的思想
开发语言·数据结构·python·算法·leetcode·深度优先
寂静山林18 小时前
UVa 12526 Cellphone Typing
算法
kyle~19 小时前
C++---嵌套类型(Nested Types)封装与泛型的基石
开发语言·c++·算法
sali-tec19 小时前
C# 基于halcon的视觉工作流-章48-短路断路
开发语言·图像处理·人工智能·算法·计算机视觉