动态规划不解释。。
#include <iostream>
#include <string.h>
using namespace std;
int map[2100][2100];
int main(int argc, const char * argv[])
{
int n;
cin >> n;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++) cin >> map[i][j];
}
int result = 0;
int height[2100];
for(int i = 0; i < n; i++){
if(i==0){
for(int j = 0; j < n; j++){
height[j] = (map[i][j]==0 ? 1 : 0);
}
}else{
for(int j = 0; j < n; j++){
if(map[i][j]) height[j] = 0;
else height[j]++;
}
}
int dp1[2100];
memset(dp1, 0, sizeof(dp1));
dp1[0] = 1;
for(int j = 1; j < n; j++){
int u = j-1;
while(u >= 0 && height[u]>=height[j]) u -= dp1[u];
dp1[j] = j-u;
}
int dp2[2100];
memset(dp2, 0, sizeof(dp2));
dp2[n-1] = 1;
for(int j = n-2; j >=0; j--){
int u = j+1;
while(u < n && height[u]>=height[j]) u += dp2[u];
dp2[j] = u-j;
}
for(int j = 0; j < n; j++){
int temp = height[j] * (dp1[j]+dp2[j]-1);
result = (result < temp ? temp : result);
}
}
cout << result << endl;
}