蓝桥集训之统计子矩阵

统计子矩阵

  • 核心思想:矩阵前缀和 + 双指针

    • 用i和j双指针 遍历所有子矩阵的列
    • 用s和t双指针 遍历所有子矩阵的行
    • 求其子矩阵的和 若>k 将s向下移动 矩阵和必定减小(元素个数减少)
    • 直到满足<=k 因为列一定 行数即为方案数 (从t行往上数到s行 共t-s+1个区间[t,t][t-1,t]....[s,t])
cpp 复制代码
  #include<iostream>
  using namespace std;
  const int N = 510;
  typedef long long LL;
  int a[N][N];
  int n,m,k;
  
  int main()
  {
      cin>>n>>m>>k;
      for(int i=1; i<=n; i++){
          for(int j=1; j<=m; j++){
              cin >> a[i][j];
              a[i][j] += a[i-1][j] + a[i][j-1] - a[i-1][j-1];  //求前缀和数组
          }
      }
      LL res = 0;
      for(int i=1;i<=m;i++)  //遍历列
      {
          for(int j=i;j<=m;j++)
          {
              for(int s=1,t=1;t<=n;t++)  //遍历行
              {
                  while(s<=t && a[t][j] - a[s-1][j] - a[t][i-1] + a[s-1][i-1] > k)
                      s++;
                  if(s<=t) res += t-s+1;
              }
          }
      }
      cout<<res;
  }
相关推荐
叫我龙翔2 分钟前
【数据结构】从零开始认识B树 --- 高效外查找的数据结构
数据结构·c++·b树
资深web全栈开发3 分钟前
贪心算法套路解析
算法·贪心算法·golang
~~李木子~~5 分钟前
贪心算法实验2
算法·贪心算法
FanXing_zl12 分钟前
快速掌握线性代数:核心概念与深度解析
线性代数·算法·机器学习
zzzsde26 分钟前
【C++】红黑树:使用及实现
开发语言·c++·算法
点云SLAM30 分钟前
C++ 中的栈(Stack)数据结构与堆的区别与内存布局(Stack vs Heap)
开发语言·数据结构·c++·内存布局·栈数据结构·c++标准算法·heap内存分配
Kuo-Teng1 小时前
LeetCode 139: Word Break
java·算法·leetcode·职场和发展·word·动态规划
Algor_pro_king_John1 小时前
模板ACM
算法·图论
前端小L1 小时前
图论专题(六):“隐式图”的登场!DFS/BFS 攻克「岛屿数量」
数据结构·算法·深度优先·图论·宽度优先
-大头.1 小时前
Python数据结构之旅:09-图论基础——连接万物的网络
数据结构·图论