4628: 【GESP2406四级】黑白方块
内存限制:64 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:1
解决:1
题目描述
⼩杨有⼀个$n$ 行$m$ 列的网格图,其中每个格子要么是白色,要么是黑色。
对于网格图中的一个子矩形,小杨认为它是平衡的当且仅当其中黑色格子与白色格子数量相同。
小杨想知道最大的平衡子矩形包含了多少个格子。
对于网格图中的一个子矩形,小杨认为它是平衡的当且仅当其中黑色格子与白色格子数量相同。
小杨想知道最大的平衡子矩形包含了多少个格子。
输入
第一行包含两个正整数$n,m$ ,含义如题面所示。
之后$n$ 行,每行一个长度为$m$ 的$01$ 串,代表网格图第$i$ 行格子的颜色,如果为$0$ ,则对应格子为白色,否则为黑色。
之后$n$ 行,每行一个长度为$m$ 的$01$ 串,代表网格图第$i$ 行格子的颜色,如果为$0$ ,则对应格子为白色,否则为黑色。
输出
输出一个整数,代表最大的平衡子矩形包含格子的数量,如果不存在则输出$0$ 。
样例输入 复制
4 5
00000
01111
00011
00011
样例输出 复制
16
提示
#include<bits/stdc++.h>
using namespace std;
const int N = 55;
int w[N][N];
int n, m;
bool check(int xa, int ya, int xb, int yb) {
int a[2] = {0,0};
for (int i = xa; i <= xb; i++) {
for (int j = ya; j <= yb; j++) {
a[w[i][j]]++;
}
}
return a[0] == a[1];
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
string s;
cin >> s;
for (int j = 1; j <= m; j++) {
w[i][j] = s[j - 1] - '0';
}
}
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
for (int ii = i; ii <= n; ii++) {
for (int jj = j; jj <= m; jj++) {
if (check(i, j, ii, jj)) {
ans = max(ans, (ii - i + 1) * (jj - j + 1));
}
}
}
}
}
cout << ans << "\n";
}