#3960. [GESP2406 四级] ⿊⽩⽅块

[GESP2406 四级] ⿊⽩⽅块

⿊⽩⽅块

题目描述

⼩杨有⼀个 ⾏ 列的⽹格图,其中每个格⼦要么是⽩⾊,要么是⿊⾊。 对于⽹格图中的⼀个⼦矩形,⼩杨认为它是平衡的当且仅当其中⿊⾊格⼦与⽩⾊格⼦数量相同。 ⼩杨想知道最⼤的平衡⼦矩形包含了多少个格⼦。

输入格式

第⼀⾏包含两个正整数 ,含义如题⾯所⽰。 之后 ⾏,每⾏⼀个长度为 的 串,代表⽹格图第 ⾏格⼦的颜⾊,如果为 ,则对应格⼦为⽩⾊,否则为⿊ ⾊。

输出格式

输出⼀个整数,代表最⼤的平衡⼦矩形包含格⼦的数量,如果不存在则输出 。 3.1.4 样例1 1 4 5 2 00000 3 01111 4 00011 5 00011 1 16 3.1.5 样例解释 对于样例1,假设 ( ) 代表第 ⾏第 列,最⼤的平衡⼦矩形的四个顶点分别为 ( ),( ),( ),( )。 3.1.6 数据范围 对于全部数据,保证有 。 3.1.7 参考程序 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N = 55; 4 int w[N][N]; 5 int n,m; 6 bool check(int xa,int ya,int xb,int yb){ 7 int a[2]={0,0}; 8 for(int i = xa;i<=xb;i++){ 9 for(int j=ya;j<=yb;j++){ 10 a[w[i][j]]++; 11 } 12 } 13 14 return a[0]==a[1]; 15 } 16 int main(){ 17 cin>>n>>m; 18 for(int i=1;i<=n;i++){ 19 string s; 20 cin>>s; 21 for(int j=1;j<=m;j++){ 22 w[i][j]=s[j-1]-'0'; 23 } 24 } 25 int ans = 0; 26 for(int i=1;i<=n;i++){ 27 for(int j=1;j<=m;j++){ 28 for(int ii=i;ii<=n;ii++){ 29 for(int jj=j;jj<=m;jj++){ 30 if(check(i,j,ii,jj)){ 31 ans = max(ans,(ii-i+1)*(jj-j+1)); 32 } 33 } 34 } 35 } 36 } 37 cout<<ans<<"\n"; 38 }

样例输入 #1

1 4 5
2 00000
3 01111
4 00011
5 00011
1 16

样例输出 #1


样例解释 #1

对于样例1,假设 ( ) 代表第 ⾏第 列,最⼤的平衡⼦矩形的四个顶点分别为 ( ),( ),( ),( )。

数据范围

对于全部数据,保证有 。

知识点与难度

本题涉及的知识点从属于 GESP 4级,难度等级:⭐⭐⭐ 。


测试点分布

Subtask 分值 测试点编号 说明
0 10 1~2 样例
1 20 3~8 小规模 / 特殊性质
2 15 9~11 Hack
3 30 12~20 中大规模
4 25 21~25 随机回归

生测试数据后,按实际 subtask 分组改写上表。