蓝桥杯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;
}
相关推荐
飞鸟吟2 分钟前
【数据结构与算法】——堆(补充)
c语言·数据结构·算法·排序算法
ゞ 正在缓冲99%…7 分钟前
leetcode167.两数之和||
java·算法·leetcode·双指针
ChoSeitaku18 分钟前
NO.88十六届蓝桥杯备战|动态规划-多重背包|摆花(C++)
c++·蓝桥杯·动态规划
明月看潮生1 小时前
青少年编程与数学 02-016 Python数据结构与算法 18课题、组合数学算法
数据结构·python·算法·青少年编程
梭七y1 小时前
【力扣hot100题】(093)最长公共子序列
算法·leetcode·职场和发展
龙萌酱1 小时前
力扣每日打卡 50. Pow(x, n) (中等)
前端·javascript·算法·leetcode
Ray-国1 小时前
2025蓝桥杯JavaB组
java·职场和发展·蓝桥杯
格格Code2 小时前
数据结构——哈希详解
算法·哈希算法
软件算法开发2 小时前
基于贝叶斯估计的多传感器数据融合算法matlab仿真
算法·matlab·贝叶斯估计·多传感器数据融合
叠叠乐2 小时前
Rust 中的Relaxed 内存指令重排演示:X=0 && Y=0 是怎么出现的?
开发语言·算法·rust