1跟0要互轉。
/* ACM 10074 Take the Land * mythnc * 2012/04/04 17:16:52 * run time: 0.012 */ #include <stdio.h> #include <string.h> #define MAXN 100 void input(int (*)[]); int findsubsum(int (*)[]); int subsum(int *, int *, int); int maxrow, maxcol; int main(void) { int matrix[MAXN][MAXN]; while (scanf("%d %d", &maxrow, &maxcol) && maxrow != 0) { input(matrix); printf("%d\n", findsubsum(matrix)); } return 0; } /* input: receive input data. */ void input(int (*matrix)[MAXN]) { int i, j, tmp; for (i = 0; i < maxrow; i++) for (j = 0; j < maxcol; j++) { scanf("%d", &tmp); /* exchange 0 and 1 */ if (tmp == 1) matrix[i][j] = 0; else matrix[i][j] = 1; } } /* findsubsum: find sub sum and return it */ int findsubsum(int (*matrix)[MAXN]) { int max, sum, i, j; int line[MAXN]; /* from row 1 to N, 2 to N, ... , calculate each * subsum */ for (i = max = 0; i < maxrow; i++) { /* init line */ memset(line, 0, sizeof(int) * maxcol); for (j = i; j < maxrow; j++) { sum = subsum(line, matrix[j], j - i + 1); if (max < sum) max = sum; } } return max; } /* subsum: use Kadane's algorithm to find the subsum */ int subsum(int *line, int *matrix, int rown) { int i, sum, max; /* add each column to line */ for (i = 0; i < maxcol; i++) line[i] += matrix[i]; for (i = sum = max = 0; i < maxcol; i++) { if (line[i] != rown) { sum = 0; continue; } sum += line[i]; if (sum > max) max = sum; } return max; }