문제 링크
https://www.acmicpc.net/problem/20002
문제
N × N 크기의 정사각형 모양 과수원이 있고, N × N 개의 사과나무가 1 × 1 크기의 간격으로 모든 칸에 심어져있다.
농부 형곤이가 가을을 맞아 사과를 수확하려는데, 땅주인 신영이가 "너는 과수원 내에 사과나무를 K × K 의 크기의 정사각형 모양으로만 수확해 가져갈 수 있어, 이때 K는 1보다 크거나 같고 N보다 작거나 같은 정수라구! 나머지는 내가 먹을께! 하하!" 라고 통보했다.
하나의 사과나무를 수확할 때, 사과를 통해 얻을 수 있는 이익과 노동비로 빠져나가는 손해가 동시에 이루어진다.
그래서 형곤이는 나무의 위치를 좌표로 하여, 사과를 통해 얻은 이익과 노동비를 더한 총이익을 2차원 배열의 형태로 정리했다.
악독한 땅주인 신영이로부터 고통받는 귀여운 형곤이에게 최대 총이익을 안겨주고 싶은 당신, 형곤이를 도와주자!
입력
첫 번째 줄에는 과수원의 크기 N이 주어진다. (1 ≤ N ≤ 300)
두 번째 줄부터 N + 1번째 줄까지, 해당 나무를 수확했을 때 얻을 수 있는 총이익을 표시한다.
총이익은 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
출력
첫 번째 줄에 최댓값을 출력한다.
예제 입력 1
4
-1 -2 -3 -4
5 6 7 8
9 10 11 12
-13 -14 -15 -16
예제 출력 1
45
예제 입력 2
3
-1 -1 -1
-1 -1 -1
-1 -1 -1
예제 출력 2
-1
알고리즘 분류
- 브루트포스 알고리즘
- 누적 합
풀이
2차원 배열에서의 누적 합을 사용하여 총 이익의 누적 합을 구한다.
그리고 정사각형 크기의 부분 배열의 이익의 합 중 가장 큰 값을 구한다.
코드
#include <iostream>
#include <string>
#include <cmath>
#include <unordered_set>
#include <unordered_map>
#include <bitset>
#include <ctime>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <climits>
#define FASTIO cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define MAX 301
#define LL long long
#define INF 1e9
using namespace std;
int N;
int MAP[MAX][MAX];
int Sum[MAX][MAX];
int Answer = -INF;
void Input() {
cin >> N;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> MAP[i][j];
}
}
}
void Settings() {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
Sum[i][j] = MAP[i][j] + Sum[i][j - 1] + Sum[i - 1][j] - Sum[i - 1][j - 1];
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
int X = min(N - i, N - j);
for (int k = 0; k <= X; k++) {
int Cur = Sum[i + k][j + k] - Sum[i - 1][j + k] - Sum[i + k][j - 1] + Sum[i - 1][j - 1];
Answer = max(Answer, Cur);
}
}
}
}
void Find_Answer() {
cout << Answer << "\n";
}
int main() {
FASTIO
Input();
Settings();
Find_Answer();
return 0;
}
'BOJ > Gold' 카테고리의 다른 글
[BOJ/Gold 4] 백준 1749 점수따먹기(C++) (0) | 2022.04.01 |
---|---|
[BOJ/Gold 5] 백준 17232 생명 게임(C++) (0) | 2022.03.31 |
[BOJ/Gold 5] 백준 19951 태상이의 훈련소 생활(C++) (0) | 2022.03.29 |
[BOJ/Gold 5] 백준 22867 종점(C++) (0) | 2022.03.14 |
[BOJ/Gold 5] 백준 1501 영어 읽기(C++) (0) | 2022.03.14 |