参考程序1:
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<vector<int>> grid(N, vector<int>(M));
for (int i = 0; i < N; ++i)
for (int j = 0; j < M; ++j)
cin >> grid[i][j];
// 构建二维前缀和,sum[i][j] 表示从 (0,0) 到 (i-1,j-1) 的格子中有多少个1
vector<vector<int>> sum(N+1, vector<int>(M+1, 0));
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= M; ++j) {
sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + grid[i-1][j-1];
}
}
int maxArea = 0;
// 枚举所有左上角 (r1,c1) 和右下角 (r2,c2)
for (int r1 = 0; r1 < N; ++r1) {
for (int c1 = 0; c1 < M; ++c1) {
for (int r2 = r1; r2 < N; ++r2) {
for (int c2 = c1; c2 < M; ++c2) {
// 使用前缀和快速计算矩形内的格子和
int total = sum[r2+1][c2+1] - sum[r1][c2+1] - sum[r2+1][c1] + sum[r1][c1];
if (total == 0) { // 全是空白
int area = (r2-r1+1) * (c2-c1+1);
maxArea = max(maxArea, area);
}
}
}
}
}
cout << maxArea << "\n";
return 0;
}
参考程序2:
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
vector<vector<int>> grid(N, vector<int>(M));
for (int i = 0; i < N; ++i)
for (int j = 0; j < M; ++j)
cin >> grid[i][j];
int maxArea = 0;
// 枚举上边界 r1
for (int r1 = 0; r1 < N; ++r1) {
vector<int> col(M, 1); // 初始化每列为全空白(有效列)
// 枚举下边界 r2 >= r1
for (int r2 = r1; r2 < N; ++r2) {
// 更新每列是否在 r1~r2 行之间全是空白
for (int c = 0; c < M; ++c) {
if (grid[r2][c] == 1) col[c] = 0; // 有草则列无效
}
// 找 col 中最长连续 1 的长度
int width = 0;
int maxWidth = 0;
for (int c = 0; c < M; ++c) {
if (col[c] == 1) width++;
else width = 0;
maxWidth = max(maxWidth, width);
}
int height = r2 - r1 + 1;
maxArea = max(maxArea, maxWidth * height);
}
}
cout << maxArea << "\n";
return 0;
}