黑白方块
欢迎报名洛谷网校,期待和大家一起进步!
:::align{center} :::
先简化问题:如果我们有一个矩形,其左上角顶点为
这个问题可以使用二重循环解决,参考代码如下:
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];
}
在 check 函数中,使用了一个数组,利用“桶计数”思想统计了范围中的
回到原本的问题中来。如果我们能够对每一个“子矩形”进行 check,判断每个子矩形中 check(i,j,i1,j1) 判断区域内是否
这个矩形的大小怎么统计呢?自然是
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 << endl;
思考题:上述做法的时间复杂度是