https://school.programmers.co.kr/learn/courses/30/lessons/118668
input :
output :
조건 :
모든 alp, cop에 대해서 시간을 구한다면?? 근데 어떻게 구현할지가 문제였음.
특정 포인트에서만 답을 구하는 것은 좋지 않음.
그리고 기본적으로 1시간을 사용해서 alp 또는 cop를 얻을 수 있는데 이를
problems에다가 넣어서 계산을 편하게 하자.
해설
해설에서는 i, j에서 i + alp_rwd, j + cop_rwd에 대해서의 점화식을 구현했다.
모든 i, j에 대해 하는 것이 편할 거 같아서 이렇게 했지만 문제가 존재했다.
요구하는 alp, cop 보다 커지는 경우에도 특정 시간에 이 결과를 기록하는 방식이 필요함.
그래서 i, j에다가 더하는 방식이 유효함.
그리고
alp, cop = min(alp, req_alp), min(cop, req_cop)
해당 라인이 유효한 이유는?
1. 우선 req_alp 또는 req_cop 가 초기 값보다 작은 경우를 대비함.
2. dp를 계산할 때의 조건이 이를 위주로 제작됨. 그래서 dp를 구하는 연산 자체가 수행이 안 될 수도 있어서 괜찮음.
def solution(alp, cop, problems):
req_alp, req_cop = -1, -1
for alp_req, cop_req, alp_rwd, cop_rwd, cost in problems:
req_alp = max(req_alp, alp_req)
req_cop = max(req_cop, cop_req)
problems.append([0, 0, 1, 0, 1])
problems.append([0, 0, 0, 1, 1])
dp = [[float("inf")] * (req_cop + 1) for _ in range(req_alp + 1)]
alp, cop = min(alp, req_alp), min(cop, req_cop)
dp[alp][cop] = 0
for x in range(alp, req_alp + 1):
for y in range(cop, req_cop + 1):
for alp_req, cop_req, alp_rwd, cop_rwd, cost in problems:
dx, dy = min(x + alp_rwd, req_alp), min(y + cop_rwd, req_cop)
if x < alp_req or y < cop_req:
continue
dp[dx][dy] = min(dp[dx][dy], dp[x][y] + cost)
return dp[req_alp][req_cop]