您的位置:首页 > 其它

题目1139:最大子矩阵

2014-04-08 17:07 246 查看
题目描述:
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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
 

代码:

#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);
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: