转来大神的话:
/**
* 首先计算每一列的前序和(即0行到所有行上值的总和)* 其次,最大的子矩阵一定在a行和b行之间,所以我们可以枚举所有的可能组合,时间复杂度为O(N*N)
* 因为我们在第一步中计算了前序和,那么第二步中a行和b行之间的子矩阵可以看成一个一维的数组,长度为N。
* 其值的计算可以利用第一步中的前序和,遍历所有列,让0-b的总和减去0-a的总和,即为a-b的总和。
* 利用该算法算出该一维数组中的最大连续子序列。时间复杂度为O(N),
* 找出最大值,最后的时间复杂度为0(N*N*N)。
*/
自己的代码:
#include <cstdio>
#define M 150
int n, a[M][M];
int main ()
{
int max, sum, m;
while(scanf("%d",&n)!=EOF)
{
for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) {scanf("%d",&a[i][j]); a[i][j]+=a[i-1][j]; }
max = a[1][1];
for(int i = 0; i <= n; i++)
{
for(int j = i; j <= n; j++)
{
sum = 0;
for(int k = 1; k <= n; k++)//很巧妙的方法来找最大值!!!
{
if(sum<0) sum = 0;
sum+=a[j][k]-a[i-1][k];
if(sum>max) max = sum;
}
}
}
printf("%d\n",max);
}
return 0;
}