http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1768
1 -1 0 0 -4 1 -1 0 0 -4 1 -1 0 0 -4
2 3 -2 -3 2 2 3 -2 -3 2 2 3 -2 -3 2
4 1 -1 5 0 -> 4 1 -1 5 0 4 1 -1 5 0
3 -2 1 -3 2 3 -2 1 -3 2 3 -2 1 -3 2
-3 2 4 1 -4 -3 2 4 1 -4 -3 2 4 1 -4
1 -1 0 0 -4 1 -1 0 0 -4
2 3 -2 -3 2 2 3 -2 -3 2
4 1 -1 5 0 4 1 -1 5 0
3 -2 1 -3 2 3 -2 1 -3 2
-3 2 4 1 -4 -3 2 4 1 -4
//先拼接成四个矩阵,然后枚举起点坐标和最大矩形和的长、宽
#include <iostream>
using namespace std;
int a[200][200],sum[200],lie[200];
int main(int argc, char *argv[])
{
int t,n,i,j,k,ans,x,y;
cin>>t;
while(t--)
{
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cin>>a[i][j];
a[i][j+n]=a[i+n][j]=a[i+n][j+n]=a[i][j]; //一个扩展成四个
}
ans=-100000000;
for(x=0;x<n;x++) //左上角横坐标
for(y=0;y<n;y++)//左上角纵坐标
for(j=0;j<n;j++)
for(i=0;i<n;i++)
{
//下面的代码是求和过程,自己模拟下,就知道是怎么计算的了
lie[i]=a[x+i][y+j];
if(i) lie[i]+=lie[i-1];
if(j) sum[i]+=lie[i];
else sum[i]=lie[i];
if(ans<sum[i]) ans=sum[i];
}
cout<<ans<<endl;
}
return 0;
}