|
这题需要动动脑子,可以找到O(NM)的算法。 但是表述很麻烦,还是看代码吧。。
#include <stdio.h>
#include <string.h>

int N, M;
int end[1024], sum[1024];
char mat[1024][1024];

int main()
  {
int i, j, k, v, ans;

 while (scanf("%d%d", &N, &M) != EOF) {
memset(end, 0, sizeof(end));
memset(sum, 0, sizeof(sum));
for (i = 0; i < N; i++)
scanf("%s", mat[i]);
ans = 0;
 for (i = 0; i < N; i++) {
 for (j = 0; j < M; j++) {
 if (mat[i][j] == '1' && end[j] <= i) {
for (k = i; k < N && mat[k][j] == '1'; k++)
sum[k]++;
end[j] = k;
}
}
 for (j = i; j < N && sum[j]; j++) {
v = (j - i + 1) * sum[j];
if (v > ans)
ans = v;
}
}
printf("%d\n", ans);
}

return 0;
}
|