https://www.acmicpc.net/problem/2579
import sys
input = sys.stdin.readline
n = int(input()) # n == 1 or n == 2인 경우
steps = [0] * (n+1)
dp = [0] * (n+1)
for i in range(1, n+1):
steps[i] = int(input())
dp[1] = steps[1]
dp[2] = steps[1] + steps[2]
dp[3] = max(steps[1], steps[2]) + steps[3] # IndexError 발생
for i in range(4, n+1):
dp[i] = max(dp[i-3] + steps[i-1], dp[i-2]) + steps[i]
print(dp[n])
n==1 or n==2
일 때, dp[3]
은 정의되지 않으므로 IndexError가 발생한다.import sys
input = sys.stdin.readline
n = int(input())
steps = [0] * 301 # IndexError 해결
dp = [0] * 301
for i in range(1, n+1):
steps[i] = int(input())
dp[1] = steps[1]
dp[2] = steps[1] + steps[2]
dp[3] = max(steps[1], steps[2]) + steps[3]
for i in range(4, n+1):
dp[i] = max(dp[i-3] + steps[i-1], dp[i-2]) + steps[i]
print(dp[n])
매번 1칸이나 2칸씩 오를 수 있으며, 연속된 3칸에 오를 수 없다는 문제 조건에 주목하면,
k
번째 계단에 오르기 위해선 다음 2가지 case가 존재한다.
k-2
)에서 올라오는 경우: dp[k-2] + steps[k]
k-1
)에서 올라오는 경우: dp[k-3] + steps[k-1] + steps[k]