<문제 링크>
https://www.acmicpc.net/problem/2579
<정답 코드>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import sys
input = sys.stdin.readline
n = int(input())
stairs = [0] * 301
for i in range(1, n + 1):
stairs[i] = int(input())
if n == 1:
print(stairs[1])
exit(0)
elif n == 2:
print(stairs[1] + stairs[2])
exit(0)
dp = [0] * 301
dp[1] = stairs[1]
dp[2] = stairs[1] + stairs[2]
dp[3] = max(stairs[1] + stairs[3], stairs[2] + stairs[3])
for i in range(4, n + 1):
dp[i] = max(dp[i - 3] + stairs[i - 1] + stairs[i], dp[i - 2] + stairs[i])
print(dp[n])
|
cs |
각 상황마다 최대값을 선택하여 dp 배열에 추가하는 식으로 진행하면 마지막에 가능한 최대 점수를 얻을 수 있다.
세 개의 계단을 연속해서 밟은 수 없다는 조건을 만족하기 위해,
현재 계단에 올 수 있는 경우의 수를 두 가지로 나누어서 고려하는 것이다.
현재 계단(i)에 오기 위해,
(현재 계단 기준)
1) 직전 계단(i-1)과 세번째 전 계단(i-3)을 밟는 것
2) 두 번째 전 계단(i-2)을 밟는 것
위 두 가지의 방법이 있다.
DP 공부를 얼른 해야겠다.
'프로그래밍 > Python' 카테고리의 다른 글
백준_python 23057번 도전 숫자왕 (set, combinations) (0) | 2024.06.19 |
---|---|
백준_python 2910번 빈도 정렬 (해시, 정렬, lambda) (0) | 2024.06.17 |
백준_python 15686번 치킨 배달(combiantions, 백트래킹) (1) | 2024.06.13 |
백준_python 2805번 나무 자르기 (이분 탐색, 시간초과) (0) | 2024.06.11 |
백준_python 4358번 생태학 (소수 반올림) (1) | 2024.06.10 |