描述:比上一题还要麻烦的题,不过改进了方法,比上一题耗时还要少,先把输入的数组复制成三分,分别在右,下,右下三个地方,然后计算从0下标到当前下标的和,然后再暴一下就可以了
#include<cstdio>
int main()
{
// freopen("a.txt","r",stdin);
int t,n,count,sum;
int num[160][160];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
sum=0;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
scanf("%d",&num[i][j]);
if(sum<num[i][j]) sum=num[i][j];
num[i][j+n]=num[i+n][j+n]=num[i][j];
if(j) num[i][j]+=num[i][j-1];
num[i+n][j]=num[i][j];
}
for(int i=0; i<2*n; i++)
for(int j=n; j<2*n; j++)
num[i][j]+=num[i][j-1];
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
for(int k=j+1; k<j+n; k++)
{
if(!j) count=num[i][k];
else count=num[i][k]-num[i][j-1];
if(count>sum) sum=count;
int c=count;
for(int len=i+1; len<n+i; len++)
{
if(!j) c+=num[len][k];
else c+=num[len][k]-num[len][j-1];
if(c>sum) sum=c;
}
}
printf("%d\n",sum);
}
return 0;
}
10827 - Maximum sum on a torus
最新推荐文章于 2016-03-09 22:03:34 发布