[BOJ] 14501 퇴사

다이나믹 프로그래밍, 브루트 포스


본 문제는 입력 N의 개수가 최대 15이다. 따라서 2^15 즉, 완전탐색을 통해 구현해도 시간에 걸리지 않는 문제이다. 만약 N이 커진다면 다이나믹 프로그래밍을 사용하여 구현해야 한다.

DP를 사용한 코드는 아래와 같다.

import sys

def solution(table, n):
    result = [0] * (n + 2)
    if table[n][0] == 1:
        result[n] = table[n][1]
    for i in range(n-1, 0, -1):
        t, p = table[i]
        # 인덱스 범위 벗어남
        if i + t > n + 1:
            result[i] = result[i + 1]
            continue
        result[i] = max(result[i + 1], result[i + t] + p)
    return max(result)

if __name__ == "__main__":
    N = int(sys.stdin.readline().rstrip())
    Table = [[0]*2 for _ in range(N + 1)]
    for idx in range(1, N+1):
        T, P = map(int, sys.stdin.readline().rstrip().split())
        Table[idx][0] = T
        Table[idx][1] = P
    print(solution(Table, N))