※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2229번 문제인 조 짜기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2229
2229번: 조 짜기
알고스팟 캠프에 N(1 ≤ N ≤ 1,000)명의 학생들이 참여하였다. 학생들은 열심히 공부를 하고 있었는데, 어느 날 조별 수업을 진행하기로 하였다. 조별 수업의 목적은 잘 하는 학생들과 덜 잘 하는
www.acmicpc.net
제한시간 2초에 N이 1000 이하이므로 O(N^2) 알고리즘을 이용하면 문제를 충분히 해결할 수 있다.
첫 학생부터 K번째 학생까지만을 조로 나눌 때 얻을 수 있는 최댓값은 다음 값들 중 하나에서 나오게 될 것이다:
"첫 학생부터 i - 1번째 학생까지를 조로 나눠 얻을 수 있는 조가 잘 짜여진 정도의 최댓값" + "i번째 학생부터 K번째 학생까지를 한 조로 이루었을 때의 조가 잘 짜여진 정도" (i는 1 이상 K 이하)
그 이유는 이를 통해 마지막 학생인 K번째 학생이 포함될 수 있는 각각의 조의 가능성에 대하여 최선의 경우를 모두 탐색해볼 수 있기 때문이다.
위 식을 계산하기 위해 각각의 정보를 잘 기록 및 갱신해 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
int dp[1001];
pair<int, int> arr[1001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N; cin >> N;
for (int i = 1; i <= N; i++) {
int score; cin >> score;
arr[i] = make_pair(score, score);
for (int j = 1; j < i; j++) {
arr[j].first = min(arr[j].first, score), arr[j].second = max(arr[j].second, score);
dp[i] = max(dp[i], dp[j - 1] + arr[j].second - arr[j].first);
}
}
cout << dp[N];
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 17370 // C++] 육각형 우리 속의 개미 (0) | 2022.01.19 |
---|---|
[BOJ 23890 // C++] 달팽이팽이 (0) | 2022.01.18 |
[BOJ 24083 // C++] 短針 (Hour Hand) (0) | 2022.01.16 |
[BOJ 24086 // C++] 身長 (Height) (0) | 2022.01.15 |
[BOJ 24078 // C++] 余り (Remainder) (0) | 2022.01.14 |