-문제:https://www.acmicpc.net/problem/2579
-정답풀이
- i-1번째 계단에서 온 경우. 이때는 i-3 -> i-1 ->i 의 루트를 거쳐야 한다. 이유는 한칸씩 연속으로 3번 오는 거를 피하기 위해서다
- i-2번째 계단에서 온 경우 이미 한칸씩 연속 세번 올 경우는 없으므로 i-2 -> i 의 루트를 생각하면 된다
위 과정을 기반으로 코드를 작성하면 다음과 같다
n=int(input())
data=[0]
for _ in range(n):
data.append(int(input()))
if n==1: #이거를 빼면 indexError가 발생한다
print(data[1])
else:
dp=[0]*(n+1)
dp[1]=data[1]
dp[2]=data[2]+data[1]
for i in range(3,n+1):
dp[i]=data[i]+max(dp[i-3]+data[i-1],dp[i-2])
print(dp[n])
-삽질 기록
이전에 풀었던 기억으로 i번째 계단으로 올라왔다면 두가지 경우가 있다
- i-1번째 계단에서 온 경우. 이때는 i-3 -> i-1 ->i 의 루트를 거쳐야 한다. 이유는 한칸씩 연속으로 3번 오는 거를 피하기 위해서다
- i-2번째 계단에서 온 경우 i-3 -> i-2 -> i의 경로를 생각했다. 근데 굳이 그럴 필요가 없이 i-2 -> i 경로만 생각하면 된다
나름 점화식 생각한다고 했는데 오류가 많다
data[i]= data[i-3] + max(data[i-1],data[i-2]) # 잘못된 점화식
dp[i]= data[i]+max(dp[i-3]+data[i-1],dp[i-2]) #이걸로 고쳐야함
'백준 > DP' 카테고리의 다른 글
[dp/백준] 1912번: 연속합(2차) (0) | 2022.06.02 |
---|---|
[dp/백준] 11053: 가장 긴 증가하는 수열 (0) | 2022.06.02 |
[dp/백준] 1149번: RGB 거리(2차) (0) | 2022.06.01 |
[dp/백준] 11726번: 2xn 타일링(2차) (0) | 2022.06.01 |
[dp/백준] 9095번: 1,2,3 더하기(2차) (0) | 2022.06.01 |