九度oj 题目1139:最大子矩阵

题目描述:

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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)似乎也不错

原文地址:https://www.cnblogs.com/jasonJie/p/5738000.html