最大全1子矩阵:https://vjudge.net/problem/POJ-3494#author=0
#include <iostream>
#include <cstdio>
#define ll long long
#define mp make_pair
#define pb push_back
#define sec second
#define fir first
#define rep(i,a,b) for(int i = (a); i <= (b); i++)
#define per(i,a,b) for(int i = (a); i >= (b); i--)
#define all(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
#define pii pair<int,int>
using namespace std;
const int N = 2100;
bool s[N][N];
int h[N][N],l[N][N],r[N][N],maxx; //h[i][j]表示以(i,j)为底的悬线高度,l[i][j]表示悬线最左移动位置
int main() { //注意!!!仅保证值为1的格子悬线信息正确
// freopen("a.txt","r",stdin);
int n, m;
while(~scanf("%d%d",&n,&m)) {
maxx = 0;
rep(i, 1, n)
rep(j, 1, m)
scanf("%d",&s[i][j]);
rep(i, 1, n) {
int prev = 1e9;
rep(j, 1, m) { //左边最后一个1的位置
prev = (s[i][j]?min(prev,j):1e9);
l[i][j] = prev;
}
prev = 0;
per(j, m, 1) { //右边最后一个1的位置
prev = (s[i][j]?max(prev,j):0);
r[i][j] = prev;
}
rep(j, 1, m) {
if(s[i-1][j]) {
h[i][j] = h[i-1][j]+1; //处理悬线信息
l[i][j] = max(l[i-1][j],l[i][j]);
r[i][j] = min(r[i-1][j],r[i][j]);
}
else h[i][j] = 1;
if(s[i][j]) maxx = max(maxx,h[i][j]*(r[i][j]-l[i][j]+1)); //更新答案
}
}
printf("%d\n",maxx);
}
return 0;
}