UVa 836 - Largest Submatrix
题目大意:给你一个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\n", ans); 48 if (T) printf("\n"); 49 } 50 return 0; 51 }