题目连接:10827 - Maximum sum on a torus
题目大意:给出一个矩阵,矩阵的上下边, 左右边使联通的, 要求在这个矩阵上找到一个子矩阵, 要求该子矩阵上所有元素的和最大。
解题思路:uva108 - Maximum Sum的升级版,将矩阵复制三份, 用四层循环遍历过所有满足条件的区间,遍历的过程中记录出现的最大值。
#include <stdio.h>
#include <string.h>
const int N = 200;
const int Min = -2147483645;
int n, Max, num[N][N], sum[N];
void input() {
Max = Min;
memset(num, 0, sizeof(num));
scanf("%d", &n);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
scanf("%d", &num[i][j]);
num[i + n][j + n] = num[i + n][j] = num[i][j + n] = num[i][j];
}
}
int solve() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
memset(sum, 0, sizeof(sum));
for (int k = i; k < n + i; k++) {
int now = 0;
for (int t = j; t < n + j; t++) {
sum[t] += num[k][t];
now +=sum[t];
if (Max < now)
Max = now;
}
}
}
}
return Max;
}
int main() {
int cas;
scanf("%d", &cas);
while (cas--) {
input();
printf("%d\n", solve());
}
return 0;
}