题意:给定一个矩阵,求最大子矩阵元素和。
思路:利用求一维数组最大子区间的方法。将矩阵降维,然后求最大子区间。
输入:
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
输出:
15
#include <stdio.h>
#include <string.h>
#define N 102
int s[N][N],temp[N];
int n;
int subsum(int* a){//求数组的最大子区间
int i,sum = 0,max = 0;
for(i = 1;i<=n;i++){
sum+=a[i];
if(sum < 0)
sum = 0;
else
max = max>sum?max:sum;
}
return max;
}
int main(){
int i,j,k,max=0,res;
freopen("a.txt","r",stdin);
scanf("%d",&n);
for(i = 1;i<=n;i++)
for(j = 1;j<=n;j++)
scanf("%d",&s[i][j]);
for(i = 1;i<=n;i++){
memset(temp,0,sizeof(temp));
for(j = i;j>=1;j--){
for(k = 1;k<=n;k++)
temp[k] += s[j][k];
res = subsum(temp);
max = max>res?max:res;
}
}
printf("%d\n",max);
return 0;
}