第十四届蓝桥杯青少组C++选拔赛[2023.2.12]第二部分编程题(4、最大空白区)

参考程序1:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {

    int N, M;
    cin >> N >> M;
    vector<vector<int>> grid(N, vector<int>(M));
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < M; ++j)
            cin >> grid[i][j];

    // 构建二维前缀和,sum[i][j] 表示从 (0,0) 到 (i-1,j-1) 的格子中有多少个1
    vector<vector<int>> sum(N+1, vector<int>(M+1, 0));
    for (int i = 1; i <= N; ++i) {
        for (int j = 1; j <= M; ++j) {
            sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + grid[i-1][j-1];
        }
    }

    int maxArea = 0;

    // 枚举所有左上角 (r1,c1) 和右下角 (r2,c2)
    for (int r1 = 0; r1 < N; ++r1) {
        for (int c1 = 0; c1 < M; ++c1) {
            for (int r2 = r1; r2 < N; ++r2) {
                for (int c2 = c1; c2 < M; ++c2) {
                    // 使用前缀和快速计算矩形内的格子和
                    int total = sum[r2+1][c2+1] - sum[r1][c2+1] - sum[r2+1][c1] + sum[r1][c1];
                    if (total == 0) { // 全是空白
                        int area = (r2-r1+1) * (c2-c1+1);
                        maxArea = max(maxArea, area);
                    }
                }
            }
        }
    }

    cout << maxArea << "\n";
    return 0;
}

参考程序2:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {

    int N, M;
    cin >> N >> M;
    vector<vector<int>> grid(N, vector<int>(M));
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < M; ++j)
            cin >> grid[i][j];

    int maxArea = 0;

    // 枚举上边界 r1
    for (int r1 = 0; r1 < N; ++r1) {
        vector<int> col(M, 1); // 初始化每列为全空白(有效列)
        // 枚举下边界 r2 >= r1
        for (int r2 = r1; r2 < N; ++r2) {
            // 更新每列是否在 r1~r2 行之间全是空白
            for (int c = 0; c < M; ++c) {
                if (grid[r2][c] == 1) col[c] = 0; // 有草则列无效
            }
            // 找 col 中最长连续 1 的长度
            int width = 0;
            int maxWidth = 0;
            for (int c = 0; c < M; ++c) {
                if (col[c] == 1) width++;
                else width = 0;
                maxWidth = max(maxWidth, width);
            }
            int height = r2 - r1 + 1;
            maxArea = max(maxArea, maxWidth * height);
        }
    }

    cout << maxArea << "\n";
    return 0;
}
相关推荐
小程故事多_808 小时前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
2601_9561219710 小时前
二分算法(知识点+题目)
c++·算法
蒙奇·D·路飞-12 小时前
OpenClaw:开源的《合金弹头》精神续作与终极本地部署指南
c++·开源·mfc
AndrewHZ13 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场13 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先
梓䈑14 小时前
【用 Vibe Coding 实现的 C++17 在线判题系统】前端开发 + Web 自动化测试
前端·c++·ai编程
冻柠檬飞冰走茶14 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
玖玥拾14 小时前
LeetCode 88 合并两个有序数组
算法·leetcode
TunerT_TQ15 小时前
Valhalla 静态工程审阅 #018|MMCV 源码证据驱动评测【大厂开源基础设施特辑】
c++·开源·mfc·#计算机视觉·#商汤科技·#openmmlab·#静态源码审计
数据皮皮侠AI15 小时前
上市公司数字供应链金融指数(2010-2024)
大数据·人工智能·算法