• 九度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)似乎也不错

  • 相关阅读:
    九度OJ 1131:合唱队形 (DP、最长上升下降序列)
    九度OJ 1130:日志排序 (排序)
    九度OJ 1129:Skew数 (大数运算)
    九度OJ 1128:求平均年龄 (基础题)
    九度OJ 1127:简单密码 (翻译)
    九度OJ 1126:打印极值点下标 (基础题)
    九度OJ 1125:大整数的因子 (大数运算)
    九度OJ 1124:Digital Roots(数根) (递归)
    存储过程
    Cookie 和 Session
  • 原文地址:https://www.cnblogs.com/jasonJie/p/5738000.html
Copyright © 2020-2023  润新知