因為只有1跟0,所以n個row的和,最大值必為n。
只要判斷該field的值是否是n,
就能判斷Maximum Sum。
/* ACM 836 Largest Submatrix
* mythnc
* 2012/04/03 16:01:37
* run time: 0.004
*/
#include <stdio.h>
#include <string.h>
#define MAXN 25
int input(char (*)[]);
int findsubsum(char (*)[], int);
int subsum(int *, char *, int, int);
void ctoi(int *, char *, int);
int main(void)
{
int n, i, len;
char matrix[MAXN][MAXN + 1];
scanf("%d", &n);
/* eat '\n' */
getchar();
for (i = 0; i < n; i++) {
if (i > 0)
putchar('\n');
/* eat blank line */
getchar();
len = input(matrix);
printf("%d\n", findsubsum(matrix, len));
}
return 0;
}
/* input: receive input data.
* return its len */
int input(char (*matrix)[MAXN])
{
int len, i;
scanf("%s", matrix[0]);
len = strlen(matrix[0]);
for (i = 1; i < len; i++)
scanf("%s", matrix[i]);
return len;
}
/* findsubsum: find sub sum and return it */
int findsubsum(char (*matrix)[MAXN], int len)
{
int max, sum, i, j;
int line[MAXN];
/* from row 1 to N, 2 to N, ... , calculate each
* subsum */
for (i = max = 0; i < len; i++) {
/* init line */
memset(line, 0, sizeof(int) * len);
for (j = i; j < len; j++) {
sum = subsum(line, matrix[j], len, j - i + 1);
if (max < sum)
max = sum;
}
}
return max;
}
/* subsum: use Kadane's algorithm to find the subsum */
int subsum(int *line, char *row, int len, int rown)
{
int i, sum, max;
/* add row to line */
ctoi(line, row, len);
for (i = sum = max = 0; i < len; i++) {
if (line[i] != rown) {
sum = 0;
continue;
}
sum += line[i];
if (sum > max)
max = sum;
}
return max;
}
/* ctoi: transform char to int */
void ctoi(int *line, char *row, int len)
{
int i;
for (i = 0; i < len; i++)
line[i] += row[i] - '0';
}
沒有留言:
張貼留言