题解(vector版)
2026-02-23 15:38:22
发布于:广东
11阅读
0回复
0点赞
前缀和
| 难度 | 7 |
|---|---|
| 复杂度 | 9 |
#include<bits/stdc++.h>
using namespace std;
int main() {
int n,m;
cin>>n>>m;
//用 g[][] 存储原图(1-indexed,g[0][*]和g[*][0]留空不用)
vector<vector<int>> g(n + 1, vector<int>(m + 1, 0));
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
cin>>g[i][j];
}
}
//构建前缀和 s[i][j] = g[1..i][1..j] 中1的个数
//显式初始化 s[0][*]=0, s[*][0]=0(vector已自动完成)
vector<vector<int>> s(n + 1, vector<int>(m + 1, 0));
for (int i=1;i<=n;i++) {
for (int j = 1; j <=m; j++) {
s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + g[i][j];
}
}
//四重循环枚举矩形 [x1,y1]~[x2,y2]
int maxArea = 0;
for (int x1 = 1; x1 <= n; x1++) {
for (int y1 = 1; y1 <= m; y1++) {
for (int x2 = x1; x2 <= n; x2++) {
for (int y2 = y1; y2 <= m; y2++) {
//计算矩形面积
int area = (x2 - x1 + 1) * (y2 - y1 + 1);
//计算矩形内1的个数(前缀和公式)
int ones = s[x2][y2] - s[x2][y1-1] - s[x1-1][y2] + s[x1-1][y1-1];
//全1⇔ones==area
if (ones == area) {
maxArea = max(maxArea, area);
}
}
}
}
}
cout<<maxArea;
return 0;
}
//YC:ALPHA-1红右手特遣队
谢谢观看!
全部评论 1
2026-02-23 来自 广东
1







有帮助,赞一个