UVa 836

  题目大意:给你一个n*n的矩阵,矩阵元素只由0和1构成,找出只包含元素1的最大子矩阵。

  二维最大连续和问题,虽然都说和UVa 108 - Maximum Sum差不多,可是我却没什么思路,只好看提示了,结果只要把矩阵中的0元素换成一个足够“大”的负数就可以了,也是,放大某些因素以便从整体上看出效果,让我想到了“一颗老鼠屎坏了一锅汤”,哈哈...

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int mat[30][30], sum[30][30];
 7 
 8 int main()
 9 {
10 #ifdef LOCAL
11     freopen("in", "r", stdin);
12 #endif
13     int T;
14     scanf("%d", &T);
15     getchar();
16     char str[30];
17     gets(str);
18     while (T--)
19     {
20         gets(str);
21         int n = strlen(str);
22         for (int i = 1; i <= n; i++)
23             mat[1][i] = str[i-1] - '0';
24         int p = 2;
25         while (gets(str) && str[0])
26         {
27             for (int j = 1; j <= n; j++)
28                 mat[p][j] = str[j-1] - '0';
29             p++;
30         }
31         memset(sum, 0, sizeof(sum));
32         for (int i = 1; i <= n; i++)
33             for (int j = 1; j <= n; j++)
34             {
35                 if (mat[i][j] == 0)  mat[i][j] = -1000;
36                 sum[i][j] = mat[i][j] + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1]; 
37             }
38         int ans = 0;
39         for (int i = 1; i <= n; i++)
40             for (int j = 1; j <= n; j++)
41                 for (int p = i; p <= n; p++)
42                     for (int q = j; q <= n; q++)
43                     {
44                         int t = sum[p][q] - sum[p][j-1] - sum[i-1][q] + sum[i-1][j-1];
45                         ans = max(ans, t);
46                     }
47         printf("%d
", ans);
48         if (T)  printf("
");
49     }
50     return 0;
51 }
View Code