#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 分组改写上表。