동적 계획법 문제는 부분 문제의 해를 이용하여 최종 문제의 답을 찾아가야 한다.
이 문제에서는 마지막 계단을 밟았을 때
의 점수의 최댓값
을 출력하는 문제였다.
dp 테이블
의 값으로는 점수의 최댓값이 들어갈 수 있겠다 라는 생각을 해볼 수 있다.마지막 계단
에서의 답을 어떻게 부분 해로 찾을 수 있을까?1 개
일 때, 2 개
일 때부터 bottom-up
방식으로 dp 테이블
을 마지막 계단까지 채워나갈 수 있겠다 라는 생각을 할 수 있다.연속된 3개의 계단을 오를 수 없기 때문에,
k 번째
계단에 오를 수 있는 경우의 수는(k - 2) 번째
계단을 밟지 않고, (k - 1) 번째
계단을 밟아서, k번째
계단에 오는 경우 (k - 2) 번째
계단을 밟고, (k - 1) 번째
계단을 밟지 않고, k번째
계단에 오는 경우(k - 2) 번째
계단을 밟고, (k - 1) 번째
계단을 밟지 않고, k번째
계단에 오는 경우(k - 2) 번째
계단을 밟지 않고, (k - 1) 번째
계단을 밟아서, k번째
계단에 오는 경우import sys
input = sys.stdin.readline
N = int(input())
W = [0]
for _ in range(N):
W.append(int(input()))
dp = [0] * (N + 3)
# N == 1 edge case
if N == 1:
print(W[1])
sys.exit()
# 기저 사례
dp[1] = W[1]
dp[2] = W[1] + W[2]
# 점화식 (연속 3칸 점프 안됨)
for i in range(3, N + 1):
dp[i] = max(
dp[i - 2] + W[i],
dp[i - 3] + W[i - 1] + W[i]
)
print(dp[N])