알고리즘 :: 백준 :: DP :: 14501 :: 퇴사
문제
상담을 적절히 했을 때, 백준이가 얻을 수 있는 최대 수익을 구하는 프로그램을 작성하시오.
문제접근
- 이미 본 velog에서 같은 문제를 bruteforce로 푸는 방법을 다뤘다.
https://velog.io/@embeddedjune/알고리즘-백준-Bruteforce-14501-퇴사 - 푸는 방법은 동일하다. 그저 DP를 사용하므로 bruteforce보다는 빠르게 답을 구할 수 있다.
- 그 마저도 이 문제는 메모이제이션 배열을 사용하지 않기 때문에 bruteforce와 시간복잡도가 거의 같다.
- 임의의 날짜를 선택하는 경우와 선택하지 않고 다음 날로 넘어가는 경우가 존재한다.
- Base condition 1. 범위를 초과하는 경우
- Base condition 2. 현재 날짜의 상담을 선택할 수가 없는 경우
코드
// https://www.acmicpc.net/problem/14501
#include <iostream>
using namespace std;
static int N, memo[15];
static pair<int, int> sched[15];
int solve(int day) {
if (day >= N) return 0; // [기저]: 범위 초과
if (day + sched[day].first > N) return solve(day + 1); // [기저]: 다음 날로 넘어갈 수 밖에 없는 경우.
if (memo[day] != 0) return memo[day]; // [기저]: 이미 메모이제이션 된 값.
// 해당 날짜를 택하는 경우와 택하지 않고 넘어가는 경우를 나눠서 계산한다.
return memo[day] = max(sched[day].second + solve(day + sched[day].first), solve(day + 1));
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> N;
for (int i = 0; i < N; ++i) cin >> sched[i].first >> sched[i].second;
cout << solve(0) << '\n';
}
결과
Author And Source
이 문제에 관하여(알고리즘 :: 백준 :: DP :: 14501 :: 퇴사), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@embeddedjune/알고리즘-백준-DP-14501-퇴사저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)