https://www.acmicpc.net/problem/15486
문제 풀이
DP를 통해서 문제를 해결하려고 했다.
dp[i]에는 i-1날까지 끝낼 수 있는 상담을 통한 최대수익을 저장했다.
첫번째로 현재 dp값이 이전 dp값의 최대보다 작은 경우 갱신해주고,
두번째로 그 날 맡은 상담을 할 수 있는지, 아니면 N보다 커서 상담이 불가능한지를 고려하여 코드를 작성했다.
남들이 작성한 코드가 시간이 적게 걸린 것 봐서는 다르게 짜는 최적 코드가 존재하는 것 같다.
소스 코드
#include <iostream>
using namespace std;
int consult[1500001][2] = {0};
int dp[1500001] = { 0 };
int main() {
int N;
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> consult[i][0] >> consult[i][1];
}
int current_max = 0;
dp[0] = 0;
for (int i = 1; i <= N; i++) {
// 현재 dp값이 이전 dp값의 최대보다 작은 경우 갱신
if (dp[i] > current_max) {
current_max = dp[i];
}
else {
dp[i] = current_max;
}
// next_day = 상담 끝나는 날
int next_day = i + consult[i][0];
if (next_day > N + 1) {
continue;
}
else {
if (dp[next_day] < dp[i] + consult[i][1])
dp[next_day] = dp[i] + consult[i][1];
}
}
int max_num = 0;
for (int i = 1; i <= N + 1; i++) {
max_num = max(max_num, dp[i]);
}
cout << max_num << '\n';
}
'알고리즘' 카테고리의 다른 글
[백준] 25943번 양팔저울 C++ 문제풀이 (0) | 2023.09.23 |
---|---|
[백준] 26111번 Parentheses Tree C++ 문제풀이 (0) | 2023.09.22 |
[백준] 2293번 동전 1 C++ 문제풀이 (0) | 2023.09.14 |
[백준] 11053번 가장 긴 증가하는 부분 수열 C++ 문제풀이 (0) | 2023.09.13 |
[백준] 1149번 RGB거리 C++ 문제풀이 (0) | 2023.09.12 |