题目大意:和 UVA - 108 差不多,不同在于可以把此题想象成球面,不设边界。
解题思路:把边界拓展一下,四个矩阵拼在一起,就可以枚举出所有情况。注意控制一下子矩阵的大小 N×N。
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#include<string.h>
const int INF = 0x3f3f3f3f;
const int NINF = -INF -1;
using namespace std;
int val[310][310];
int sum[310];
int T, N;
int main() {
scanf("%d", &T);
while (T--) {
scanf("%d", &N);
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++) {
scanf("%d", &val[i][j]);
val[i+N][j] = val[i][j+N] = val[i+N][j+N] = val[i][j];
}
int maxn = NINF;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
memset(sum, 0, sizeof(sum));
for (int k = i; k < i+N; k++) {
int tmp = 0;
for (int l = j; l < j+N; l++) {
sum[l] += val[k][l];
if (tmp < 0) {
tmp = 0;
}
tmp += sum[l];
if (tmp > maxn) {
maxn = tmp;
}
}
}
}
}
printf("%d\n", maxn);
}
return 0;
}