상담을 적절히 했을 때, 백준이가 얻을 수 있는 최대 수익을 구하는 프로그램을 작성하시오.
// 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';
}