처음에는 아래와 같이 첫날부터 확인하는 방식으로 풀었다.
N = int(input())
li = [list(map(int, input().split())) for _ in range(N)]
dp = [0 for _ in range(N+1)]
for i in range(N):
for j in range(i + li[i][0], N+1):
if dp[j] < dp[i] + li[i][1]:
dp[j] = dp[i] + li[i][1]
print(dp[-1])
통과되긴 해도 일단 반복문이 2개라 아래 사진과 같이 무의미한 동작이 상당히 많다.
반복문 하나로 끝낼 방법이 없을까 하다가 그냥 마지막 날부터 확인하면 되겠다는 생각이 들어 아래와 같이 수정했다.
N = int(input())
li = [list(map(int, input().split())) for _ in range(N)]
dp = [0 for _ in range(N+1)]
for i in range(N-1, -1, -1):
if i + li[i][0] > N:
dp[i] = dp[i+1]
else:
dp[i] = max(dp[i+1], li[i][1] + dp[i + li[i][0]])
print(dp[0])
'Agorithm > 백준 알고리즘' 카테고리의 다른 글
백준 알고리즘 9311번 Robot in a Maze(python) (0) | 2021.12.22 |
---|---|
백준 알고리즘 11256번 사탕(python) (0) | 2021.10.26 |
백준 알고리즘 17204번 죽음의 게임(python) (0) | 2021.10.25 |
백준 알고리즘 16173번 점프왕 쩰리 (Small)(python) (0) | 2021.10.21 |
백준 알고리즘 3182번 한동이는 공부가 하기 싫어!(python) (0) | 2021.08.10 |