把二维的子矩阵转化为求一维的最大子数组
#include<stdio.h>
#include<string.h>
int N;
int map[101][101];
int temp[101];
int getsum()
{
int sum = 0,max = 0;//不用初始为-127,可以一个数也不加
for(int i = 1;i <= N;i ++)
{
sum += temp[i];
if(sum > max) max = sum;
if(sum < 0) sum = 0;
}
return max;
}
int main()
{
while(~scanf("%d",&N))
{
for(int i = 1;i <= N;i ++)
for(int j = 1;j <= N;j ++)
scanf("%d",&map[i][j]);
int ans = -127;
for(int i = 1;i <= N;i ++)//从第i行开始
{
memset(temp,0,sizeof(temp));
for(int j = i;j <= N;j ++)//从i行到j行都尝试一次
{
for(int k = 1;k <= N;k ++)//把i到j行的每一列加起来。。。就是矩阵压缩
temp[k] += map[j][k];
int pre = getsum();//计算压缩的最大和
if(ans < pre)//注意范围-127.。
ans = pre;
}
}
printf("%d\n",ans);
}
return 0;
}