알고리즘/삼성SW역량테스트기출
[백준 14501번 - 퇴사] C++ 풀이
Ompang
2021. 9. 18. 15:13
728x90
반응형
백준 14501번.

사용한 알고리즘
- dfs
N이 최대 15이기 때문에, dfs 재귀로 시도를 먼저 해보았다.
i번째 날부터 시작한다고 가정했을 때 dfs 를 호출한다. (총 N번 호출)
각 경우마다, 해당 날에 상담을 하고, 다음 상담 가능일부터~ N일 까지 dfs 를 호출한다. (N - 현재 날 - Ti 번 호출)
현재 날짜에 해당 상담을 하면 N일이 넘어가거나, N일이면 반환.
완성 코드
#include <stdio.h>
#include <vector>
#include <stack>
using namespace std;
int n;
vector<pair<int, int>> v;
int ans = 0;
void dfs(int time, int curr_t, int result) {
if (time + curr_t > n) {
ans = (result > ans) ? result : ans;
return;
} else if (time + curr_t == n) {
ans = (result + v[time].second > ans) ? result + v[time].second : ans;
return;
} else {
for(int i = 0; i < n - time - curr_t; ++i) {
dfs(time + curr_t + i, v[time + curr_t + i].first, result + v[time].second);
}
}
}
int main() {
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
int t, p;
scanf("%d %d", &t, &p);
v.push_back(make_pair(t, p));
}
for(int i = 0; i < n; ++i) {
dfs(i, v[i].first, 0);
}
printf("%d\n", ans);
}
풀고 나서 다른 분들의 풀이를 살펴보니 dp 로 푸는 것이 더 간단할 것 같다.
dp[오늘] = max(dp[오늘 스케줄 소화할 경우], dp[오늘 스케줄 소화하지 않을 경우])
728x90