首页 > 代码库 > UVA10827 - Maximum sum on a torus

UVA10827 - Maximum sum on a torus

题目链接


题意:给出一个环形矩阵,也就是第一行和最后一行是相连的,第一列和最后一列是相连的,求最大的子矩阵的和

思路:只要将矩阵复制四个,那么就可以按照求一个矩阵内最大子矩阵之和的做法去做,即枚举所有子矩阵的和,更新最大值。要注意在转换后的大矩阵,枚举的子矩阵规格是有范围的。

代码:

#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;
}