F - Maximum sum on a torus UVA - 10827

#include <cstdio>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <map>
#include <cstring>
#include <set>
#include <stack>
#include <cstdlib>
#include <bitset>
using namespace std;
int n;
long long par[160][160];
long long a[160][160];
void init()
{
    for(int i=1; i<=n*2; i++)
        for(int j=1; j<=n*2; j++)
            par[i][j]=par[i-1][j]+a[i][j];//先求行的和
    for(int i=1; i<=n*2; i++)//再求列的和
        for(int j=1; j<=n*2; j++)
            par[i][j]+=par[i][j-1];

}
long long  gcd(int x,int y,int r,int c)//r,c分别代表矩形的长宽
{
    return par[x+r-1][y+c-1]-par[x-1][y+c-1]-par[x+r-1][y-1]+par[x-1][y-1];
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                scanf("%lld",&a[i][j]);
                a[i][j+n]=a[i+n][j]=a[i+n][j+n]=a[i][j];//矩阵扩大三倍
            }
        long long  int ans=-1e12;
        init();
        //保证矩阵的大小小于n
        for(int x=1; x<=n; x++)
            for(int y=1; y<=n; y++)
                for(int r=1; r<=n; r++)
                    for(int c=1; c<=n; c++)
                    {
                        ans=max(ans,gcd(x,y,r,c));
                    }
        printf("%lld\n",ans);
    }
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/zhangzhenjunaixuxin/article/details/81461171
今日推荐