小秋的矩阵

0小秋的矩阵 - 蓝桥云课

问题描述

给你一个 n 行 m 列只包含 0 和 1 的矩阵,求它的所有子矩阵中,是方阵而且恰好包含 k 个 0 的数量。

方阵是行数和列数相等的矩阵。

子矩阵是从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序),被称为原矩阵的一个子矩阵。

输入格式

第 1 行输入 3 个整数 n, m, k,表示矩阵的行数,列数和所求子矩阵包含 0 的数量。

接下来 n 行,每行输入 m 个整数,第 i 行表示给定矩阵的第 i 行。

输出格式

输出仅一行,包含 1 个整数,表示答案。

样例输入

复制代码
3 4 2
0 1 1 0
1 0 0 1
0 1 0 0

样例输出

复制代码
4

说明

共有 4 个阶数为 2 的方阵符合条件,左上角的坐标分别为 (1,1), (1,2), (1,3), (2,1)。

评测数据规模

  • 对于 20% 的评测数据,1 ≤ n × m ≤ 10³。
  • 对于 40% 的评测数据,1 ≤ n × m ≤ 10³。
  • 对于 100% 的评测数据,1 ≤ n × m ≤ 10⁶,0 ≤ k ≤ n × m。

运行限制

语言 最大运行时间 最大运行内存
C 1s 256M
C++ 1s 256M
Python3 3s 256M
Java 2s 256M
PyPy3 3s 256M
Go 3s 256M

思路:

我们可以把0变成1,1变成0.这样计算0的数量就变成计算1的数量。之后就是正常的二维前缀和,枚举正方形。

有两个点:

1.找出每一个正方形的(x1,y1),(x2,y2)

2.边长的取值范围

代码如下:

复制代码
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1e3+10;
int n,m,k,ans;
int a[N][N];
int pre[N][N];
int main() 
{
     ios::sync_with_stdio(0);
     cin.tie(0);
     cout.tie(0);
     cin >> n >> m >> k;
    for(int i = 1 ; i <= n ; i++)
    {
        for(int j = 1 ; j <= m ; j++)//0和1变换,然后求出子矩阵包含k个1的数量 
        {
            int temp;
            cin >> temp;
            if(temp == 1)
            a[i][j] = 0;
            else if(temp == 0) 
            a[i][j] = 1; 
        }
    }
    for(int i = 1 ; i <= n ; i++)
    {
        for(int j = 1 ; j <= m ; j++)
        {
            pre[i][j] = pre[i-1][j] + pre[i][j-1] - pre[i-1][j-1] + a[i][j];
        }
     } 
     int ans = 0;
    for (int i = 1; i <= n; i++) 
    {
        for (int j = 1; j <= m; j++) 
        {
            int max_len = min(n - i + 1, m - j + 1);
            for (int l = 1; l <= max_len; l++)// 枚举边长 
            {
                int x2 = i + l - 1;
                int y2 = j + l - 1;
                int x1 = i;
                int y1 = j; 
                int sum = pre[x2][y2] - pre[x1-1][y2] - pre[x2][y1-1] + pre[x1-1][y1-1];
                if (sum == k) 
                {
                    ans++;
                }
            }
        }
    }
    cout << ans;
    return 0;
}
相关推荐
微三云 - 廖会灵 (私域系统开发)2 天前
企业大模型应用工程化思考:跳出 Demo 陷阱,构建「业务‑资产‑Agent」三层落地架构
人工智能·矩阵·重构
tryxr2 天前
矩阵的几种基础变换
java·数据结构·算法·矩阵
syagain_zsx3 天前
算法基础篇 · 04 前缀和(C++ 题解)
c++·算法·前缀和
俗人六哥AI企业获客盈利系统3 天前
知识库才是AI落地的分水岭
人工智能·线性代数·矩阵·自动化
微三云 - 廖会灵 (私域系统开发)5 天前
私域电商多端商城系统架构实践:小程序 / APP / H5 一套后端如何落地
矩阵·重构·零售
微三云 - 廖会灵 (私域系统开发)5 天前
多端商城统一账号体系设计实践:小程序 / APP / H5 登录打通与账号合并
矩阵·重构·自动化·零售
智购无人售货机厂家8 天前
2026自动售货机品类拓展逻辑:从饮料零食到鲜食药品文创的工程实践~YH
服务器·人工智能·单片机·线性代数·矩阵
IT小白杨8 天前
社媒多账号运营的环境隔离:一张图谱模型,解释清“为什么换IP还是被连坐“
经验分享·笔记·矩阵·指纹浏览器
镜像视界(浙江)科技有限公司9 天前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
wzdark10 天前
稀疏矩阵存储结构及其运算复杂度研究4
线性代数·矩阵