问题 D: 最大子矩阵
时间限制: 1 Sec 内存限制: 128 MB
题目描述
有一个包含正数和负数的二维数组。一个子矩阵是指在该二维数组里,任意相邻的下标是
1 x 1
或更大的子数组。一个子矩阵的和是指该子矩阵中所有元素的和。本题中,把具有最大和的子矩阵称为最大子矩阵。
例如,如下数组的最大子矩阵位于左下角,
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
最大子矩阵为
9 2
-4 1
-1 8
其和为15。
输入
第一行是一个测试数据的个数T,表示将会有T组测试数据。下一行输入一个正整数N,表示二维方阵的大小。接下来是N2个整数(由空格和换行隔开)。该数组的N2个整数,是以行序给出的。也就是,先是第一行的数,由左到右;然后是第二行的数,由左到右,等等。N可能达到100,数组元素的范围是[-127,127]。
输出
与测试数据对应,刚好有T行,每行输出最大子矩阵的和。
样例输入
240 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -233 9 -5-9 4 -23 6 -7
样例输出
1519
提示
//QUST 1229
//问题 D: 最大子矩阵
#include<stdio.h>
int square[101][101];
void reset(void);
void reset(void){
int n,m;
for(n=0;n<101;n++)
for(m=0;m<101;m++)
square[n][m]=0;
}
void load(int n);
void load(int n){
int count;
int x,y;
for(y=1;y<=n;y++)
for(x=1;x<=n;x++)
scanf("%d",&square[x][y]);
}
int calc(int allsize);
int calc(int allsize){
int xsize,ysize;
int px,py;
int cx,cy;
int sum;
int max=-127;
for(ysize=1;ysize<=allsize;ysize++){
for(xsize=1;xsize<=allsize;xsize++){
for(py=1;py<=(allsize+1-ysize);py++){
for(px=1;px<=(allsize+1-xsize);px++){
sum=0;
for(cy=py;(cy-py)<=(ysize-1);cy++){
for(cx=px;(cx-px)<=(xsize-1);cx++){
sum+=square[cx][cy];
}
}
if(sum>max)
max=sum;
}
}
}
}
return max;
}
int main()
{
int thesize;
int n,count;
scanf("%d",&n);
for(count=1;count<n;count++){
// reset();
scanf("%d",&thesize);
load(thesize);
printf("%d\n",calc(thesize));
}
reset();
scanf("%d",&thesize);
load(thesize);
printf("%d",calc(thesize));
return 0;
}
使用穷举法算是A了,穷举可能的子矩阵大小,当前子矩阵大小下可能的首元素,以及满足以上条件的子矩阵的和,可读性一如既往的一般。