题意:
给出一个n*m的01矩阵,求出最大的全1子矩阵的面积,可以任意改变行的顺序。
思路:
枚举每一列,按照以这一列为末尾的连续1的个数排序,再枚举子矩阵的右下角。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5005;
char a[MAXN][MAXN];
int dp[MAXN][MAXN], tmp[MAXN];
bool cmp(const int a, const int b) {
return a > b;
}
int main() {
// freopen("in.txt", "r", stdin);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%s", a[i] + 1);
}
for (int i = 1; i <= n; i++) {
int cnt = 0;
for (int j = 1; j <= m; j++) {
if (a[i][j] == '1') ++cnt;
else cnt = 0;
dp[i][j] = cnt;
}
}
int ans = 0;
for (int j = 1; j <= m; j++) {
for (int i = 1; i <= n; i++) tmp[i] = dp[i][j];
sort(tmp + 1, tmp + 1 + n, cmp);
for (int i = 1; i <= n; i++)
ans = max(ans, tmp[i] * i);
}
printf("%d\n", ans);
}