※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts