본문 바로가기
백준 풀이

[백준/BOJ] - 2579번 python 풀이 - DP

by 반오십 코린이 2022. 12. 29.
728x90


Key Point 

 

dp 문제를 보면 일단 dp 배열의 값에 어떤 값이 들어갈지 이에 대한 규칙을 찾아야 한다.

보통 1,2 와 같은 앞에 있는 번호들은 점화식에 적용되지 않는 경우가 많으므로 인지하고 진행.

 

d[0] = s[0]
d[1] = s[0] + s[1]
d[2] = max(s[0] + s[2], s[1] + s[2])
d[3] = max(d[0] + s[2] + s[3], d[1] + s[3]) 

# 2전 칸에서 1칸 이동 + 1칸 이동하여 해당 계단에 오는 경우도 있을 것이고

# 3전 칸에서 2칸 이동 + 1칸 이동하여 해당 계단에 오는 경우도 있다.

이 경우 중에 max값 도출.

 

 2156 포도주 문제와 다른 점은 해당 문제는 마지막 계단을 꼭 밟아야 한다는 조건 때문에 dp를 계산할 때 해당 idx의 계단을 밟는다고 가정하고 값을 구해야한다.

반면 포도주 문제는 해당 조건이 없으므로 바로 직전 포도주의 dp값을 그대로 넘겨받아도 문제가 없는 것이다.

 

https://www.acmicpc.net/problem/2156

 

2156번: 포도주 시식

효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규

www.acmicpc.net

https://taewogi.tistory.com/72

 

[백준/BOJ] - 2156번 python 풀이 - DP

Key Point 점화식을 구하기 위해 모든 경우의 수를 따져보면 다음과 같이 3가지 case로 나눠지는 것을 확인 할 수 있다. 노란색 하이라이트 부분이 기준이다. 가장 중요한 점은 dp기준으로 바로 다음

taewogi.tistory.com


n=int(input()) 
s=[int(input()) for _ in range(n)] 
dp=[0]*(n) 
if len(s)<=2: # 계단이 2개 이하일땐 더해서 출력
    print(sum(s))
else: # 계단이 3개 이상일 때
    dp[0]=s[0] # 첫째 계단
    dp[1]=s[0]+s[1] # 둘째 계단
    for i in range(2,n): # 3번째 계단 부터 dp 점화식 이용해서 최대값 구하기
        dp[i]=max(dp[i-3]+s[i-1]+s[i], dp[i-2]+s[i])
    print(dp[-1]) #배열 맨 마지막이 정답이므로
728x90