给定 n\times nn×n 个字符,每个字符只能是 0 或 1,请从中找到一个完全由 0 构成的正方形区域,且正方形的边长达到最大。

输入

5

11111

10000

10000

00000

11111                                输出:3

方法1:二维前缀和二分

最大空方阵有一个特点:这个方阵的和为肯定  0。

我们就可以利用这个性质用二维前缀和维护二维数组中任意两个下标之间的和,随后对于每个点二分出该点往右下角方向最多能“延伸”(此处指在保证值仍为 0  的情况下最多能朝某个方向移动几格,以下出现的“延伸”除了特殊备注都是这个意思)几格,更新答案即可。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <limits.h>
#include <cstring>
using namespace std;typedef long long LL;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f, INF_BIT = 0x3f;const int N = 3010;int n;
char c;int a[N][N];int s[N][N];
int getsum(int xa, int ya, int xb, int yb){return s[xb][yb] - s[xa - 1][yb] - s[xb][ya - 1] + s[xa - 1][ya - 1];
}bool check(int mid){for(int i = 1;i <= n - mid + 1;i++){for(int j = 1;j <= n - mid + 1;j++){if(getsum(i, j, i + mid - 1, j + mid - 1) == 0){return true;}}}return false;
}int main(){scanf("%d", &n);for(int i = 1;i <= n;i++){for(int j = 1;j <= n;j++){cin >> c;a[i][j] = c - '0';s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];}}int l = 0, r = n;while(l <= r){int mid = l + (r - l) / 2;if(check(mid)) l = mid + 1;else r = mid - 1;}printf("%d", l - 1);return 0;
}

方法3:单调栈

好像题解区里面也没有这种解法

我们定义 t_{i, j}  表示 (i, j)  这个下标最多能向上“延伸”几格

那么我们可以枚举最大空方阵的结束行 i,然后对这一行的所有列 j 计算这个值最多能向左右“延伸”(在保证这个值是最小值的情况下最多能朝左右移动几格)到哪个下标(以下称下标 j 向左最多“延伸”的下标为 l_j ​,向右最多“延伸”的下标为 r_j ),计算完之后我们就可以枚举所有的 jj,把当前遍历到的这个空方阵的边长设为 min(ti,j​,rj​−lj​+1) 不断更新答案即可

而可以快速计算出“一个下标 j 最多能向左右‘延伸’到哪个下标”的数据结构就是 单调队列了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <limits.h>
#include <cstring>
using namespace std;typedef long long LL;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f, INF_BIT = 0x3f;const int N = 3010;int n;
char c;int a[N][N];int t[N][N];int st[N], tp;int l[N], r[N];int ans;int main(){scanf("%d", &n);for(int i = 1;i <= n;i++){for(int j = 1;j <= n;j++){cin >> c;a[i][j] = c - '0';}}for(int i = 1;i <= n;i++){for(int j = 1;j <= n;j++){if(a[i][j] == 1) t[i][j] = 0;else t[i][j] = t[i - 1][j] + 1;}}for(int i = 1;i <= n;i++){tp = 0;memset(l, 0, sizeof(l));memset(r, 0, sizeof(r));t[i][n + 1] = -1;for(int j = 1;j <= n + 1;j++){while(tp && t[i][st[tp]] > t[i][j]){r[st[tp]] = j - 1;tp--;}st[++tp] = j;}t[i][0] = -1;for(int j = n;j >= 0;j--){while(tp && t[i][st[tp]] > t[i][j]){l[st[tp]] = j + 1;tp--;}st[++tp] = j;}for(int j = 1;j <= n;j++){ans = max(ans, min(t[i][j], r[j] - l[j] + 1));}}printf("%d", ans);return 0;
}

方法2, dp法,

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3005;
char mp[N][N];
int n;
int dp[N][N];
int ans;
int main(){cin>>n;for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){cin>>mp[i][j];}
}
for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){if(mp[i][j]=='0'){dp[i][j]=1+min(dp[i-1][j-1],min(dp[i][j-1],dp[i-1][j]));}else dp[i][j]=0;ans=max(ans,dp[i][j]);
}
}
cout<<ans;return 0;
}

YACS20223月乙组——最大空方阵相关推荐

  1. YACS20223月丙组——三扔硬币

    扔 n  次硬币的结果可以用一串 0/1  序列来表示.给定 n ,请统计有多少种扔硬币的结果中不含三个连续的 0 且不含三个连续的 1 . 当 n 较大的时候,答案可能很大,所以输出答案模  1,0 ...

  2. 上海11月月赛乙组解题报告

    上海11月月赛乙组解题报告 1.数对统计 题目描述 给定 n 个数字 a1,a2,--,an,请从中挑选两个数字,并按原顺序组成一个数对.请问能选出多少种不完全相等的数对? 输入格式 第一行,单个整数 ...

  3. 计蒜客信息学3月普及组模拟赛

    A. 断幺九 题目链接 分值:100 时间限制:1000ms 测试点数目:10 B. 锈湖 题目链接 分值:100 时间限制:2000ms 测试点数目:10 C. 图  题目链接 分值:100 时间限 ...

  4. DD 摆磁铁(计蒜客信息学8月普及组模拟赛)

    DD 摆磁铁 这道题来自 计蒜客信息学8月普及组模拟赛 普及组!! 把我一个TG选手看懵了 看来我要回去打普及了 题目大意 给出一个n个节点的树,要把树上给定的2*m个节点两两配对,两个节点配对的产生 ...

  5. 上海计算机学会2023年3月月赛C++乙组T1卡片游戏

    卡片游戏 内存限制: 256 Mb时间限制: 1000 ms 题目描述 小爱拿到了n张卡片,每张卡片的正反面均写有一个数字,其中第i张卡片的正面的数字为ai​,反面的数字为bi​. 他想把每张卡片选取 ...

  6. 中国科学7月微生物组专刊:赵立平、秦楠、东秀珠领衔

    宏基因组按:中国科学继6月菌群研究作为封面文章后,7月再次发力微生物组专刊,8篇微生物组相关文章让你一次看个够. 以下内容来源自"中国科学生命科学"公众号. 微生物生活在地球的各个 ...

  7. 【计蒜客模拟赛系列】-计蒜客2021年8月普及组模拟赛

    提前:本文中部分代码和思路有借鉴或摘抄计蒜客官方题解 赛后总结 本次模拟赛的难度总算正常了些 个人战绩: 220/400,排名61 ,太弱了,一大堆AK爷 题目质量评价: 题目相比CSP-J还是简单了 ...

  8. 中国探月计算机考试时间,揭秘人类探月历程(组图)

    月球是地球的近邻,它的起源一直是人类不断探索的谜题之一.研究月球可提高人类对宇宙的认识.月球表面保留着数十亿年前与彗星和小行星碰撞的痕迹,而地球上的地质变化销毁了这些记录.因此,探测月球可以提供有关地 ...

  9. 2020 蓝桥杯 Java实现 10月B组省赛

    题目列表 试题 A: 门牌制作 试题 B: 寻找 2020 试题 C: 蛇形填数 试题 D: 七段码 试题 E: 排序 试题 F: 成绩分析 试题 G: 单词分析 试题 H: 数字三角形 试题 I: ...

最新文章

  1. php getconfig,PHP: tidy::getConfig - Manual
  2. python二级考试真题_2020年宁夏二级建造师考试《建筑工程》真题及答案-二级建造师...
  3. 3 行 Python 代码实现假聊天机器人(慎入:这是假机器人!!!)
  4. 企业网络推广——企业网络推广中如何解决网站排名提升难题?
  5. PowerBuilder窗口之间传递多参数的方法
  6. Spring核心技术原理-(1)-通过Web开发演进过程了解一下为什么要有Spring?
  7. Qt学习笔记之QTextCodec
  8. RTX3090 Super曝光:完整GA102核心加持、性能提升5%
  9. TCC分布式实现原理及分布式应用如何保证高可用
  10. 北妈每日总结: 2019年前端人必须学会写博客
  11. 简单的字谜游戏--可扩展--2015年7月25日14:58:00V1.1版
  12. JavaScript 对象和字串之间的转换
  13. 这一回,我们聊聊恐惧
  14. HDU4841 圆桌问题【约瑟夫环+模拟+STL】
  15. 【零开始】怎样购买、配置服务器及发布网站(页)?
  16. 阶段3 2.Spring_03.Spring的 IOC 和 DI_3 spring基于XML的IOC环境搭建和入门
  17. Windows控制台cmd默认代码页修改的办法【GBK、UTF-8】
  18. 系统试运行报告_水污染源在线监测系统验收内容及模板(新版)
  19. FileZilla中文乱码解决方法
  20. matlab textscan溢出,matlab - Textscan存档有大量的行 - 堆栈内存溢出

热门文章

  1. matlab 转移矩阵,在Matlab中构造多阶马尔可夫链转移矩阵
  2. html怎么设置竖线符号,竖线符号怎么打【运用方式】
  3. Wi-Fi的 8-stream sounding 和 8x8 MU-MIMO之间有什么关系?
  4. 【原创】西门子S7-1500读写巴鲁夫RFID的方法
  5. vue前端 数组如何通过时间字段升序降序
  6. 42岁程序员面试,java书籍入门下载
  7. 管理的职能包括计划、组织、领导、控制这四种基本职能
  8. 计算机网络之网络架构
  9. 以下关于python语言的描述中、错误的是,关于Python语言的注释,以下选项中描述错误的是:()...
  10. 2010年北京理工大学中国象棋棋软比赛的冠军引擎新旋风三代升级到Tornado v1.0.4.0, 加密采用Safengine Licensor v1.8.4