우하단 / 좌하단 대각선 누적합을 각각 진행해주고, (x, y)에서 변의 길이가 k인 형태에서의 아름다운 정도를 구해서 답을 갱신해주면 된다. $O(N^3)$으로 해결 가능하다.
int N, A[MAXN][MAXN], B[MAXN][MAXN];
int main(void) {
fastio;
cin >> N;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> A[i][j];
B[i][j] += B[i - 1][j + 1] + A[i][j]; // B 좌하단 대각선 누적합
A[i][j] += A[i - 1][j - 1]; // A 우하단 대각선 누적합
}
}
int ans = -INF;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
for (int k = 0; k <= N - max(i, j); k++) {
int x1 = j, x2 = j + k;
int y1 = i, y2 = i + k;
int beautiful = (A[y2][x2] - A[y1 - 1][x1 - 1])
- (B[y2][x1] - B[y1 - 1][x2 + 1]);
ans = max(ans, beautiful);
}
}
}
cout << ans;
return 0;
}
'알고리즘' 카테고리의 다른 글
[BOJ 17952] 과제는 끝나지 않아! (0) | 2024.04.29 |
---|---|
[BOJ 22862] 가장 긴 짝수 연속한 부분 수열 (large) (1) | 2024.04.02 |
[BOJ 22858] 원상 복구 (small) (0) | 2024.04.02 |
[BOJ 11508] 2+1 세일 (0) | 2024.04.01 |
[BOJ 9660] 돌 게임 6 (0) | 2024.04.01 |