题意:给出一个环形矩阵,也就是第一行和最后一行是相连的,第一列和最后一列是相连的,求最大的子矩阵的和
思路:只要将矩阵复制四个,那么就可以按照求一个矩阵内最大子矩阵之和的做法去做,即枚举所有子矩阵的和,更新最大值。要注意在转换后的大矩阵,枚举的子矩阵规格是有范围的。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 205;
int arr[MAXN][MAXN], sum[MAXN];
int n, Max;
int deal() {
int temp;
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++) {
temp = 0;
for (int l = j; l < j + n; l++) {
sum[l] += arr[k][l];
temp += sum[l];
if (Max < temp)
Max = temp;
}
}
}
}
return Max;
}
int main() {
int cas;
scanf("%d", &cas);
while (cas--) {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &arr[i][j]);
arr[i][j + n] = arr[i + n][j] = arr[i + n][j + n] = arr[i][j];
}
}
Max = -INF;
int ans = deal();
printf("%d\n", ans);
}
return 0;
}