题目1139:最大子矩阵

来源:互联网 发布:现在淘宝开店步骤 编辑:程序博客网 时间:2024/06/07 05:47
题目描述:

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

输出:

测试数据可能有多组,对于每组测试数据,输出最大子矩阵的大小。

样例输入:
40 -2 -7 09 2 -6 2-4 1 -4  1-1 8  0 -2
样例输出:

15

 

代码:

#include<stdio.h>#include<stdlib.h>#define Max 110 //得到序列中连续子序列的最大和 int getMax(int b[],int n){int ans = b[0];    int max = ans;    for (int i=1; i<n; i++)    {        (b[i] + ans > b[i])? ans += b[i] : ans = b[i];//判断ans大于0还是小于0         if (max < ans)        {            max = ans;        }    }    return max;}int main(){int n;int a[Max][Max];while(scanf("%d",&n) != EOF){int max = -200,tmp;for(int i = 0; i < n;i++)for(int j = 0;j < n; j++)scanf("%d",&a[i][j]);for(int i = 0 ; i < n ; i++){int sum[Max] = {0};for(int j = i ;j < n;j++){int k;for(k = 0; k < n; k++){sum[k] += a[j][k];//一维数组保存的是从第i到第j行的和,动态更新 }tmp = getMax(sum,k);if(tmp > max)max = tmp; }}printf("%d\n",max);}}


 

0 0