- 题目描述:
-
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。
比如,如下4 * 4的矩阵
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
的最大子矩阵是
9 2
-4 1
-1 8
这个子矩阵的大小是15。
- 输入:
-
输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。
再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。
已知矩阵中整数的范围都在[-127, 127]。
- 输出:
-
测试数据可能有多组,对于每组测试数据,输出最大子矩阵的大小。
- 样例输入:
-
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
- 样例输出:
-
15
1 #include <cstdio> 2 #include <cstdlib> 3 #include <string> 4 #include <cstring> 5 #include <algorithm> 6 #include <cmath> 7 #define MAX 102 8 #define inf 1000000009 9 int mat[MAX][MAX]; 10 int temp[MAX]; 11 12 int main(int argc, char const *argv[]) 13 { 14 int n; 15 // freopen("input.txt","r",stdin); 16 while(scanf("%d",&n) != EOF) { 17 for(int i = 0; i < n; i++) { 18 for(int j = 0; j < n; j++) { 19 scanf("%d",&mat[i][j]); 20 } 21 } 22 memset(temp, 0, sizeof(temp)); 23 24 int max = -1 * inf; 25 26 for(int i = 0; i < n; i++) { 27 memset(temp,0, sizeof(temp)); 28 29 for(int j = i; j < n; j++) { 30 for(int k = 0; k < n; k++) { 31 temp[k] = temp[k] + mat[k][j]; 32 } 33 //cal max length 34 int maxi = -1 * inf; 35 int sumi = 0; 36 for(int k = 0; k < n; k++) { 37 sumi = sumi + temp[k]; 38 if(maxi < sumi) { 39 maxi = sumi; 40 } 41 if(sumi < 0) { 42 sumi = 0; 43 } 44 45 } 46 if(max < maxi) { 47 max = maxi; 48 } 49 } 50 51 } 52 printf("%d ",max); 53 } 54 return 0; 55 }
注意38行先进行判断,之后再
if(sumi < 0) {
sumi = 0;
}写成
sumi = max(0, sumi)似乎也不错