문제
![](https://velog.velcdn.com/images%2Fcosmos%2Fpost%2Fba63c08d-d4c2-40fc-b16f-935974493116%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-07%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2010.51.49.png)
풀이
다이나믹 프로그래밍 문제이다.
- 계단을 오르는 데는 아래와 같은 규칙이 있다.
1) 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음 다음 계단으로 오를 수 있다.
2) 연속된 세 개의 계단을 모두 밟아서는 안 된다. 단, 시작점은 계단에 포함되지 않는다.
3) 마지막 도착 계단은 반드시 밟아야 한다.
코드
import sys
input = sys.stdin.readline
def dp(n, staris):
if n <= 2:
return sum(stairs)
d = [0] * 301
d[0] = stairs[0]
d[1] = stairs[0] + stairs[1]
d[2] = max(stairs[0] + stairs[2], stairs[1] + stairs[2])
for i in range(3, n):
d[i] = max(d[i-3] + stairs[i-1] + stairs[i], d[i-2] + stairs[i])
return d[n-1]
if __name__ == '__main__':
n = int(input())
stairs = [int(input()) for _ in range(n)]
print(dp(n, stairs))
결과
![](https://velog.velcdn.com/images%2Fcosmos%2Fpost%2F76e5b895-5640-4c6f-aaae-e402bc737e16%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-03-07%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%201.33.00.png)
출처 & 깃허브
BOJ 2579
github