출처 : 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))
'Algorithm' 카테고리의 다른 글
[백준] 톱니바퀴 14891번 (python) 구현 (1) | 2024.09.08 |
---|---|
[백준] 주사위 굴리기 14499번 (python) 구현 (0) | 2024.09.03 |
[백준] RGB거리 2 17404번 (python) DP 무조건적인 선택 (0) | 2024.08.23 |
[백준] 암호 코드 2011번 (python) DP (0) | 2024.08.18 |
[백준] ACM Craft 1005번 (python) 위상정렬 + dp (0) | 2024.08.04 |