Algorithm
[백준] 내려가기 2096번 (python) 원도우를 활용한 DP
salmon16
2024. 8. 31. 19:28
출처 : https://www.acmicpc.net/problem/2096
풀이 방법
처음에는 일반적인 DP문제로 풀이하였다 max와 min은 함수만 다르게 사용하고 점화식은 똑같다.
처음 풀이 방법
dp[i][j] = i, j일 때 최대 포인트 ( 0 <= j <= 3)
dp[i][0] = max(dp[i-1][0], dp[i-1][1]) + point[i][0]
dp[i][0] = max(dp[i-1][0], max(dp[i-1][1], dp[i-1][2])) + point[i][1]
dp[i][2] = max(dp[i-1][1], dp[i-1][2]) + point[i][2]
최소일 때는 반대
이렇게 max일 때와 min일 때 반복문을 두 번 돌았다.
이렇게 풀이하게 된다면 메모리 초과가 발생하게 된다.
그래서 윈도우를 활용해야하는데 윈도우를 사용하는 방법은 사용하지 않는 dp를 저장하지 않는 것이다.
즉 i번째 dp의 값을 구하려면 i-1번째 dp의 값만 필요하므로 i-1번째 dp의 값만 저장한다.
그렇게 한다면 점화식이 아래와 같다.
maxDp = [max(maxDp[0], maxDp[1]) + point[0], max(maxDp[0], max(maxDp[1], maxDp[2])) + point[1], max(maxDp[1], maxDp[2]) + point[2]]
min일 때는 max함수를 min으로 수정해 주면 된다.
전체 코드
N = int(input())
point = list(map(int, input().split()))
maxDp = point
minDp = point
for i in range(N-1):
point = list(map(int, input().split()))
maxDp = [max(maxDp[0], maxDp[1]) + point[0], max(maxDp[0], max(maxDp[1], maxDp[2])) + point[1], max(maxDp[1], maxDp[2]) + point[2]]
minDp = [min(minDp[0], minDp[1]) + point[0], min(minDp[0], min(minDp[1], minDp[2])) + point[1], min(minDp[1], minDp[2]) + point[2]]
print(max(maxDp), min(minDp))