-
题目描述:
-
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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>
const int INF = 0x7fffffff;
int buf[110][110];
int add[110][110];
int ans[110];
int n;
int res;
int max(int x, int y){return x > y ? x : y;}
int main()
{
freopen("Test.txt","r",stdin);
while(scanf("%d",&n) != EOF)
{
int i,j,k;
for(i = 1; i <= n; i++)
{
buf[0][i] = 0;
for(j = 1; j <= n; j++)
{
scanf("%d",&buf[i][j]);
if(i == 1)
add[i][j] = buf[i][j];
else
add[i][j] = add[i-1][j] + buf[i][j];
}
}
res = -INF;
for(i = 1; i <= n; i++)
{
for(j = 0; j < i; j++)
{
for(k = 1; k <= n; k++)
{
ans[k] = add[i][k] - add[j][k]; //从第1行到第i行的压缩矩阵
}
for(k = 1; k <= n; k++)
{
if(k != 1)
ans[k] = max(ans[k-1]+ans[k],ans[k]);
if(ans[k] > res)
res = ans[k];
}
}
}
printf("%d\n",res);
}
return 0;
}