본문 바로가기

알고리즘/백준

[백준] 14501번 퇴사

반응형

14501번 퇴사


1. 이해하기

  • 상담을 하여 가장 많이 받을 수 있는 금액을 얻는 방법.
  • 모든 날의 상담을 할 수 있는 것이 아닌 최종 일전까지만 상담을 받을 수 있고 상담이 최종일까지 끝나야 한다.
  • 완전탐색과 DP로 풀 수 있다.

2. 구현하기

  • 완전탐색 방법

    • 최종일을 넘는 경우에는 상담을 하지 못하므로 0을 반환한다.
    • day+1을 넣어주는 경우는 그 날에는 상담을 하지 않고 다음 날에 상담을 하는 경우도 찾아주기 위해서이다.
    int solve(int day, int pay) {
        if(day > N) return 0;
        if(day == N) return pay;
    
        int ret = 0;
        ret = max(ret,solve(day+1,pay));
        ret = max(ret,solve(day+schedule[day].day,pay+schedule[day].pay));
        return ret;
    }

3. 전체 코드

  • 완전탐색

    #include <iostream>
    #include <cstring>
    using namespace std;
    struct INF{
        int day,pay;
    };
    INF schedule[20];
    int N;
    
    int solve(int day, int pay) {
        if(day > N) return 0;
        if(day == N) return pay;
    
        int ret = 0;
        ret = max(ret,solve(day+1,pay));
        ret = max(ret,solve(day+schedule[day].day,pay+schedule[day].pay));
        return ret;
    }
    
    int main() {
        cin >> N;
        for(int i = 0; i < N; i++) cin >> schedule[i].day >> schedule[i].pay;
        cout << solve(0,0) << '\n';
        return 0;
    }
  • DP

    #include <iostream>
    using namespace std;
    struct INF{
        int day,pay;
    };
    int cache[16];
    INF schedule[15];
    int N;
    
    int main() {
        int N;
        cin >> N;
        for(int i = 0; i < N; i++) {
            cin >> schedule[i].day >> schedule[i].pay;
        }
        for(int i = 0; i < N; i++) {
            if(i-1 > 0) cache[i] = max(cache[i],cache[i-1]);
            cache[schedule[i].day+i] = max(cache[schedule[i].day+i], cache[i]+schedule[i].pay);
        }
        int ans = 0;
        for(int i = 0; i <= N; i++) {
            if(cache[i] > ans) ans = cache[i];
        }
        cout << ans << '\n';
        return 0;
    }

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 14503번 로봇 청소기  (0) 2019.10.04
[백준] 14502번 연구소  (0) 2019.10.03
[백준] 14500번 테트로미노  (0) 2019.10.03
[백준] 14499번 주사위 굴리기  (0) 2019.10.03
[백준] 13458번 시험 감독  (0) 2019.10.03