ν‹°μŠ€ν† λ¦¬ λ·°

728x90
λ°˜μ‘ν˜•

문제

 

14501번: 퇴사

첫째 쀄에 백쀀이가 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡을 좜λ ₯ν•œλ‹€.

www.acmicpc.net

 

문제 풀이

 N일 이후에 퇴사λ₯Ό ν•˜λŠ”λ°, κ·Έ μ „κΉŒμ§€ ν•  수 μžˆλŠ” 일듀 쀑 μ΅œλŒ€ 수읡이 λ‚˜λŠ” 경우의 수읡의 합을 λ°˜ν™˜ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

  1일 2일 3일 4일 5일 6일 7일
Ti 3 5 1 1 2 4 2
Pi 10 20 10 20 15 40 200

 μœ„μ˜ μ˜ˆμ‹œμ˜ 경우 6, 7에 μƒλ‹΄ν•˜λŠ” 일은 퇴사 μ΄ν›„κΉŒμ§€ 일을 μ§„ν–‰ν•˜μ—¬μ•Ό ν•˜λ―€λ‘œ ν•  수 μ—†λ‹€. μ˜ˆμ‹œμ—μ„œ κ°€μž₯ μ΅œλŒ€ μˆ˜μ΅μ„ λ°œμƒμ‹œν‚€λŠ” κ²½μš°λŠ” 1, 4, 5일에 μƒλ‹΄ν•˜λŠ” κ²½μš°μ΄λ‹€.

 

 μƒλ‹΄μ„ ν•˜λŠ” 것에 λŒ€ν•΄ 두 가지 κ²½μš°κ°€ μžˆλ‹€. 첫 λ²ˆμ§ΈλŠ” 상담을 ν•˜λŠ” 것이고, 두 λ²ˆμ§ΈλŠ” 상담을 ν•˜μ§€ μ•ŠλŠ” 것이닀. 이λ₯Ό λ°˜μ˜ν•˜μ—¬ 경우의 수λ₯Ό κ³„μ‚°ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 계산 ν•  수 μžˆλ‹€.

 

 κ·Έλ¦Όκ³Ό 같이 ν•΄λ‹Ή μΌμžμ— 상담을 ν•˜λŠ”κ°€, μ•ˆν•˜λŠ”κ°€μ— 따라 (a), (b)와 같이 가지가 λ»£λŠ” 것을 μ•Œ 수 μžˆλ‹€. λ”°λΌμ„œ DFSλ₯Ό 일을 ν•˜λŠ” κ²½μš°μ™€, ν•˜μ§€ μ•ŠλŠ” 경우λ₯Ό μž¬κ·€ 호좜 ν•˜λ©΄ λœλ‹€.

 

μ½”λ“œ

from sys import stdin


def dfs(day, pay):
    global answer
    cur_pay, next_pay = pay

    if day >= n:
        if day == n:
            answer = max(answer, cur_pay + next_pay)
        else:
            answer = max(answer, cur_pay)
        return

    dfs(day + 1, pay)
    cur_pay += next_pay
    next_day, next_pay = works[day]
    dfs(day + next_day, [cur_pay, next_pay])


if __name__ == "__main__":
    answer = 0
    n = int(stdin.readline())
    works = [list(map(int, stdin.readline().split())) for _ in range(n)]

    dfs(0, [0, 0])
    print(answer)

 μž¬κ·€ν˜ΈμΆœμ„ μ’…λ£Œν•˜λŠ” μ‘°κ±΄μ—μ„œ n보닀 큰 κ²½μš°λŠ” 퇴사 μ΄ν›„μ˜ 일을 μ²˜λ¦¬ν•  수 μ—†μœΌλ―€λ‘œ ν˜„μž¬κΉŒμ§€ μ²˜λ¦¬ν•œ μž‘μ—…λ§Œ λ°˜μ˜ν•˜μ—¬μ•Ό ν•œλ‹€. DFSλ₯Ό 호좜 ν•  λ•Œ, λ‹¨μˆœνžˆ λ‚ μ§œλ§Œ μ¦κ°€μ‹œν‚€λŠ” κ²½μš°κ°€ ν•΄λ‹Ή λ‚ μ§œμ˜ 일을 ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ΄λ‹€.

728x90
λ°˜μ‘ν˜•
λŒ“κΈ€
κΈ€ 보관함
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€