时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:446
解决:148
-
题目描述:
-
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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
-
答疑:
- 解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7862-1-1.html
代码清单
#include <string.h>
#include <stdio.h>
#define SIZE 100
int matrix[SIZE][SIZE];
int lineral[SIZE];
int max;
int max_ctn_substr(int size){
int sum = lineral[0],max = sum;
for(int i=1; i<size; i++){
sum = (lineral[i] < sum+lineral[i]) ? sum+lineral[i] : lineral[i];
if(sum > max) max = sum;
}
return max;
}
int main(){
int n;
while(scanf("%d",&n) != EOF){
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d",&(matrix[i][j]));
max=-200000;
for(int i=0; i<n; i++){
memset(lineral,0,n*sizeof(int));
for(int j=i; j<n; j++){
for(int k=0; k<n; k++)
lineral[k] += matrix[j][k];
int sum = max_ctn_substr(n);
if(max<sum) max = sum;
}
}
printf("%d\n",max);
}
return 0;
}
/**************************************************************
Problem: 1139
User: denallo
Language: C
Result: Accepted
Time:60 ms
Memory:948 kb
****************************************************************/