[백준/BOJ] 백준 20002번 : 사과나무
2022. 2. 5. 04:30ㆍ알고리즘 문제풀이
https://www.acmicpc.net/problem/20002
20002번: 사과나무
N × N 크기의 정사각형 모양 과수원이 있고, N × N 개의 사과나무가 1 × 1 크기의 간격으로 모든 칸에 심어져있다. 농부 형곤이가 가을을 맞아 사과를 수확하려는데, 땅주인 신영이가 "너는 과수원
www.acmicpc.net
2차원 누적합을 만들고, 수확할 수 있는 모든 구간을 확인하여 문제를 해결했다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
vector<vector<int>> board(305, vector<int>(305, 0));
vector<vector<int>> psum(305, vector<int>(305, 0));
int result = -987654321;
//2차원 누적합 만들기
void MakePsum()
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
psum[i][j] = psum[i][j - 1] + psum[i - 1][j] - psum[i - 1][j - 1] + board[i][j];
}
}
}
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
int input;
cin >> input;
board[i][j] = input;
}
}
MakePsum();
for (int k = 1; k <= n; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
pair<int, int> point1 = make_pair(i, j);
pair<int, int> point2 = make_pair(i + k - 1, j + k - 1);
if (point2.first > n || point2.second > n)
continue;
int this_result = psum[point2.first][point2.second] - psum[point2.first][point1.second - 1] - psum[point1.first - 1][point2.second] + psum[point1.first - 1][point1.second - 1];
result = max(result, this_result);
}
}
}
cout << result;
return 0;
}
'알고리즘 문제풀이' 카테고리의 다른 글
[백준/BOJ] 백준 2239번 : 스도쿠 (0) | 2022.02.05 |
---|---|
[백준/BOJ] 백준 15669번 : 나무 위의 입자 (0) | 2022.02.05 |
[백준/BOJ] 백준 2450번 : 모양 정돈 (0) | 2022.02.05 |
[백준/BOJ] 백준 2671번 : 잠수함식별 (0) | 2022.02.05 |
[백준/BOJ] 백준 1013번 : Contact (0) | 2022.02.05 |