题意:给出一个环形矩阵,也就是第一行和最后一行是相连的,第一列和最后一列是相连的,求最大的子矩阵的和
思路:只要将矩阵复制四个,那么就可以按照求一个矩阵内最大子矩阵之和的做法去做,即枚举所有子矩阵的和,更新最大值。要注意在转换后的大矩阵,枚举的子矩阵规格是有范围的。
代码:
#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; }
UVA10827 - Maximum sum on a torus
时间: 2024-10-05 22:36:49