#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 1010
using namespace std;
int n,m;
int map[N][N];
bool M[N][N];
int sum[N][N];
int le[N][N];
int ri[N][N];
int h[N][N];
void getsum()
{
for(int i=1;i<=n;i++)
{
int s=0;
for(int j=1;j<=m;j++)
{
s+=map[i][j];
sum[i][j]=s+sum[i-1][j];
}
}
}
void init()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(!M[i][j])
le[i][j]=0;
else le[i][j]=le[i][j-1]+1;
}
for(int j=m;j>=1;j--)
{
if(!M[i][j])
ri[i][j]=0;
else ri[i][j]=ri[i][j+1]+1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(M[i][j]&&M[i-1][j])
{
h[i][j]=h[i-1][j]+1;
le[i][j]=min(le[i][j],le[i-1][j]);
ri[i][j]=min(ri[i][j],ri[i-1][j]);
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
M[i][j]=!map[i][j]?0:1;
}
}
getsum();
init();
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(M[i][j])
{
int ptx1,pty1,ptx2,pty2,ptx3,pty3,ptx4,pty4;
ptx1=i,pty1=j-le[i][j];
ptx2=i-h[i][j]-1,pty2=j-le[i][j];
ptx3=i-h[i][j]-1,pty3=j+ri[i][j]-1;
ptx4=i,pty4=j+ri[i][j]-1;
ans=max(ans,sum[ptx4][pty4]-sum[ptx1][pty1]-sum[ptx3][pty3]+sum[ptx2][pty2]);
}
}
}
printf("%d\n",ans);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/wzq_qwq/article/details/47168903