B4415 [GESP202509 四级] 排兵布阵
题目描述
作为将军,你自然需要合理地排兵布阵。地图可以视为 n 行 m 列的网格,适合排兵的网格以 1 标注,不适合排兵的网格以 0 标注。现在你需要在地图上选择一个矩形区域排兵,这个矩形区域内不能包含不适合排兵的网格。请问可选择的矩形区域最多能包含多少网格?
输入格式
第一行,两个正整数 n, m,分别表示地图网格的行数与列数。
接下来 n 行,每行 m 个整数 a_{i,1}, a_{i,2}, ..., a_{i,m},表示各行中的网格是否适合排兵。
输出格式
一行,一个整数,表示适合排兵的矩形区域包含的最大网格数。
输入输出样例 #1
输入 #1
4 3
0 1 1
1 0 1
0 1 1
1 1 1
输出 #1
4
输入输出样例 #2
输入 #2
3 5
1 0 1 0 1
0 1 0 1 0
0 1 1 1 0
输出 #2
3
说明/提示
对于所有测试点,保证 1 ≤ n, m ≤ 12,0 ≤ a_{i,j} ≤ 1。
解析
本题采用暴力枚举法求解。通过枚举矩形的左上角和右下角坐标,判断该区域内是否全为 1,从而计算最大面积。
#include <bits/stdc++.h>
using namespace std;
int m, n;
int a[105][105];
int ans = 0;
// 计算 bx(开始行),by(开始列),ex(结束行),ey(结束列)
// 范围是否都可以排兵
bool f(int bx, int by, int ex, int ey) {
for (int i = bx; i <= ex; i++) {
for (int j = by; j <= ey; j++) {
if (a[i][j] == 0) {
return 0;
}
}
}
;
}
{
cin >> n >> m;
( i = ; i <= n; i++) {
( j = ; j <= m; j++) {
cin >> a[i][j];
}
}
( i = ; i <= n; i++) {
( j = ; j <= m; j++) {
( k = i; k <= n; k++) {
( l = j; l <= m; l++) {
((i, j, k, l)) {
ans = (ans, (k - i + ) * (l - j + ));
}
}
}
}
}
cout << ans;
;
}

