a[i][j]表示从第一行到第i行第j个数的和,然后计算p到q行之间的最大子矩阵时,将p到q行之间第j个数的和看做一个元素,求这些元素的最大连续子序列和;
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int a[110][110];
int main()
{
int n;
while (cin>>n)
{
int sum=0,v,maxn,maxx=0;
memset(a,0,sizeof(a));
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
cin>>v;
a[i][j]=a[i-1][j]+v;
}
for (int i=1;i<=n;i++)
for (int j=i;j<=n;j++)
{
sum=0;
maxn=0;
for (int k=1;k<=n;k++)
{
sum+=(a[j][k]-a[i-1][k]);
if (sum>maxn)
maxn=sum;
else if (sum<0)
sum=0;
}
maxx=max(maxx,maxn);
}
cout<<maxx<<endl;
}
}