/*
求出每个点向上最多的连续1的个数。
然后看这个1 × x的向左,向右最多可以扩展到哪里。
*/
#include
#include
using namespace std;
const int maxn = 1000 + 10;
int n , m;
int l[maxn][maxn], r[maxn][maxn], up[maxn][maxn], data[maxn][maxn], dp[maxn][maxn];
void getup(){
for(int i = 1 ;i <= n; ++i)
for(int j = 1 ; j<= m; ++ j){
if(data[i][j]) up[i][j] = up[i-1][j] +1;
else up[i][j] = 0;
}
}
void getl(){
for(int i = 1 ; i<= n;++i){
for(int j = 1 ;j <= m;++ j){
int now = j - 1;
while(up[i][now] >= up[i][j] && now > 0){
now = l[i][now];
}
l[i][j] = now ;
}
}
}
void getr()
{
for(int i = 1 ;i <= n; ++ i)
r[i][m] = m + 1;
for(int i = 1 ; i<= n; ++ i)
for(int j = m ;j >= 1 ; -- j){
int now = j + 1;
while(up[i][now] >= up[i][j] && now <= m){
now = r[i][now];
}
r[i][j] = now ;
}
}
int slove(){
int ret = 0;
for(int i = 1 ; i<= n; ++i)
for(int j = 1 ;j <= m; ++ j){
ret = max(ret,up[i][j] * (r[i][j] - l[i][j] -1));
}
return ret;
}
int main(){
while(scanf("%d%d",&n,&m) != EOF){
for(int i = 1 ; i<= n; ++ i)
for(int j = 1 ;j <= m;++ j)
scanf("%d",&data[i][j]);
getup();
getl();
getr();
int ans = slove();
printf("%d\n",ans);
}
return 0;
}
九度1470
最新推荐文章于 2017-03-12 20:57:19 发布