-
[백준 14501번 - 퇴사] C++ 풀이알고리즘/삼성SW역량테스트기출 2021. 9. 18. 15:13728x90반응형
백준 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'알고리즘 > 삼성SW역량테스트기출' 카테고리의 다른 글
[백준 14499번 - 주사위 굴리기] C++ 풀이 (0) 2021.09.19 [백준 12100번 - 2048(Easy)] C++ 풀이 (0) 2021.09.18 [백준 14502번 - 연구소] C++ 풀이 (0) 2021.09.18 [백준 13458번 - 시험 감독] C++ 풀이 (0) 2021.09.17 [백준 3190번 - 뱀] C++ 풀이 (0) 2021.09.16