[BOJ] Q14501 퇴사

Question

Language: Python

Difficulty: Silver 3

각 날에 대해서 상담을 진행했을 때와 안 했을 때를 보면서 최대 보상을 구해야한다. 위 문제의 Time, Prize는 아래와 같다. ||||||||| |–|–|–|–|–|–|–|–| |Index|1|2|3|4|5|6|7| |Ti|3|5|1|1|2|4|2| |Pi|10|20|10|20|15|40|200|

다음과 같이 상담을 진행했을 경우, 만약 기존에 받을 수 있었던 보상보다 높은 경우를 이를 대체하고, 그렇지 않은 경우 그대로 둔다. 또한 상담을 진행하지 못하는 경우, 이때 까지 받을 수 있는 최대 보상값을 기입한다. |Index|1|2|3|4|5|6|7|Max_Prize| |–|:–:|:–:|:–:|:–:|:–:|:–:|:–:|:–:| |1일날 상담 진행시|0|0|10|||||10| |2일날 상담 진행시|0|0|10|||20||20| |3일날 상담 진행시|0|0|10|10||20||20| |4일날 상담 진행시|0|0|10|10+20||20||30| |5일날 상담 진행시|0|0|10|10+20|10+20+15|20||45| |6일날 상담 불가|0|0|10|10+20|10+20+15|45||45| |7일날 상담 불가|0|0|10|10+20|10+20+15|45|45|45|

maxPrize을 유지하므로써 중간 연산을 생략할 수 있다.

Solution

def solution():
    dp=[0] * (n)
    maxPrize=0
    for i in range(0,n):
        maxPrize=max(maxPrize,dp[i])
        if i + time[i] <n:
            dp[i+time[i]]=max(dp[i+time[i]],maxPrize+prize[i])
    
    return maxPrize

if __name__ == "__main__":
    n=int(input())
    times=[]
    prizes=[]

    for _ in range(n):
        time,prize=map(int,input().split())
        times.append(time)
        prizes.append(prize)
    print(solution())

댓글남기기