https://www.acmicpc.net/problem/9465
O(N^2)는 불가i번째 열에서 선택 가능한 경우의 수는 다음과 같다
- 위쪽 스티커 떼기
- 아래쪽 스티커 떼기
- 아무것도 안 떼기
score[i][0] = max(score[i-1][1], score[i-2][1]) + arr[i][0]
score[i][1] = max(score[i-1][0], score[i-2][0]) + arr[i][1]
i-2까지 고려하는 이유는, 아무것도 선택하지 않고 넘어간 다음 선택하는 경우가 최적일 수 있기 때문이다.
import sys
input = sys.stdin.readline
t = int(input())
for _ in range(t):
n = int(input())
arr = [list(map(int, input().split())) for _ in range(2)]
score = [[0] * n for _ in range(2)]
score[0][0] = arr[0][0]
score[1][0] = arr[1][0]
for i in range(1, n):
if i == 1:
score[0][i] = score[1][i - 1] + arr[0][i]
score[1][i] = score[0][i - 1] + arr[1][i]
else:
score[0][i] = max(score[1][i - 1], score[1][i - 2]) + arr[0][i]
score[1][i] = max(score[0][i - 1], score[0][i - 2]) + arr[1][i]
print(max(score[0][n - 1], score[1][n - 1]))
정답은 통과가 됐지만, 점화식을 따라가다 보면 score 배열을 따로 선언하지 않아도 되는 것을 알 수 있다. i-1, i-2의 정보만 저장하는 변수를 통해 메모리를 줄여보겠다.
import sys
input = sys.stdin.readline
t = int(input())
for _ in range(t):
n = int(input())
arr = [list(map(int, input().split())) for _ in range(2)]
now_top = arr[0][0]
now_bot = arr[1][0]
prev_top = 0
prev_bot = 0
for i in range(1, n):
new_top = max(now_bot, prev_bot) + arr[0][i]
new_bot = max(now_top, prev_top) + arr[1][i]
prev_top, prev_bot = now_top, now_bot
now_top, now_bot = new_top, new_bot
print(max(now_top, now_bot))

score 배열을 변수 4개로 줄이면서 메모리 사용량이 줄어든 것을 확인할 수 있다.
또한 그만큼의 메모리를 할당하고 해제하는 작업이 사라져 속도 역시 20% 빨라진 것을 확인할 수 있다.