题目链接:hdoj 2830
不说什么了,上代码:
#include<cstdio>
#include<cstring>
#include<string>
#define debug 0
#define M(a) memset(a,0,sizeof(a))
#define Max(a,b) ((a>b)?a:b)
const int maxn = 1000 + 5;
int h[maxn], num[maxn];
int n, m;
void Do(){
char get; //因为是连续的 01,要用字符读取
int ans = 0;
for (int i = 1; i <= n; i++)
{
M(num);
for (int j = 1; j <= m; j++)
{
while ((get = getchar()) == ' ' || get == '\n');
if (get == '1')
h[j]++; //记录高度
else
h[j] = 0;
for (int k = 1; k <= h[j]; k++) //这题的唯一难点:因为是横向就可以组矩阵
{ //所以高度大的都可组较低的矩阵。
num[k]++;
}
}
for (int k = 1; k <= i; k++)
{
ans = Max(ans, k*num[k]); //高*宽
}
}
printf("%d\n", ans);
}
int main(){
#if debug
freopen("in.txt", "r", stdin);
#endif//debug
while (~scanf("%d%d", &n, &m))
{
M(h);
Do();
}
return 0;
}