Programming/BackJoon
2579 - 계단 오르기
홍열
2023. 3. 16. 13:58
728x90
1) 문제 설명
계단을 오르는 데 조건이 있다
계단은 한번에 한 계단 혹은 두 계단씩 오를 수 있다. 한 계단을 밝으면 그 다음 혹은 그 다음 다음 계단을 밟을 수 있다
연속된 세개 계단은 밟을 수 없다
마지막 계단은 반드시 밟아야 한다
2) 문제 이해
조건에 왜 마지막 계단을 밟아야 되는지를 주었는지 모르겠다
일단 dp 문제라고 이해하고, 규칙을 찾아본다
첫번째 계단은
밟거나 밟지 않을 수 있다. (2 계단을 건너뛸 수도 있으므로..)
두번째 계단은
첫번째 계단을 밟고, 또 밟을 수 있다. 그리고 두번째 계단만 밟을 수도 있다.
세번째 계단은
첫번째 계단을 밟고, 2칸을 건너뛴 다음에 세번째를 밟을 수 있고
2번째 계단을 밟고, 3번째 계단을 밟는 경우가 있다.
네번째부터는 점화식을 세울 수 있다
경우 1) 세번째를 밟지않고, 그 이전에는 밟고 자기 자신을 밟을때
경우 2) 세번째, 네번째 계단을 밟고, 3계단 이전 계단을 밟을때
그림으로 표시해보면 더 이해가 쉬운데, 어디를 안밟고 오느냐의 차이이다.
식을 계산해보면 다음과 같다
n = int(input())
dp = [0] * n
lst = [int(input()) for _ in range(n)]
for i in range(n):
if i == 0:
dp[i] = max(lst[i], 0)
elif i == 1:
dp[i] = max(lst[1] + lst[0], dp[0])
elif i == 2:
dp[i] = max(lst[i] + dp[i-2], lst[2]+lst[1])
else:
dp[i] = max(dp[i-2]+lst[i], lst[i]+lst[i-1]+ dp[i-3])
print(dp[-1])