具体见acwing每日一题
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2010;
int n, m, Q, l[N], r[N], s[N][N], q[N];
int U[N], D[N], L[N], R[N];
char g[N][N];
int calc(int h[], int n){
int tt = 0; q[0] = 0, h[0] = -1;
for(int i = 1; i <= n; i ++){
while(h[q[tt]] >= h[i]) tt --;
l[i] = q[tt], q[++ tt] = i;
}
tt = 0; q[0] = n + 1, h[n + 1] = -1;
for(int i = n; i >= 1; i --){
while(h[q[tt]] >= h[i]) tt --;
r[i] = q[tt], q[++ tt] = i;
}
int res = 0;
for(int i = 1; i <= n; i ++) res = max(res, h[i] * (r[i] - l[i] - 1));
return res;
}
void init(){
// 上
for(int i = 1; i <= n; i ++){
for(int j = 1; j <= m; j ++)
if(g[i][j] == '1') s[i][j] = s[i - 1][j] + 1;
else s[i][j] = 0;
U[i] = max(U[i - 1], calc(s[i], m));
}
// 下
memset(s, 0, sizeof s);
for(int i = n; i >= 1; i --){
for(int j = 1; j <= m; j ++)
if(g[i][j] == '1') s[i][j] = s[i + 1][j] + 1;
else s[i][j] = 0;
D[i] = max(D[i + 1], calc(s[i], m));
}
// 左
memset(s, 0, sizeof s);
for(int i = 1; i <= m; i ++){
for(int j = 1; j <= n; j ++)
if(g[j][i] == '1') s[i][j] = s[i - 1][j] + 1;
else s[i][j] = 0;
L[i] = max(L[i - 1], calc(s[i], n));
}
// 右
memset(s, 0, sizeof s);
for(int i = m; i >= 1; i --){
for(int j = 1; j <= n; j ++)
if(g[j][i] == '1') s[i][j] = s[i + 1][j] + 1;
else s[i][j] = 0;
R[i] = max(R[i + 1], calc(s[i], n));
}
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i ++) cin >> g[i] + 1;
init();
return 0;
}