2행 n열로 배치된 스티커 2n개에 각각 점수가 매겨졌다.
스티커를 떼어내면 상하좌우가 찢어져서 주변 스티커는 사용 못한다.
사용한 스티커의 점수 합이 최대가 되는 그 최댓값을 구하는 문제
문제
상근이의 여동생 상냥이는 문방구에서 스티커 2n개를 구매했다. 스티커는 그림
상냥이가 구매한 스티커의 품질은 매우 좋지 않다. 스티커 한 장을 떼면, 그 스티커와 변을 공유하는 스티커는 모두 찢어져서 사용할 수 없게 된다. 즉, 뗀 스티커의 왼쪽, 오른쪽, 위, 아래에 있는 스티커는 사용할 수 없게 된다.

모든 스티커를 붙일 수 없게된 상냥이는 각 스티커에 점수를 매기고, 점수의 합이 최대가 되게 스티커를 떼어내려고 한다. 먼저, 그림
위의 그림의 경우에 점수가 50, 50, 100, 60인 스티커를 고르면, 점수는 260이 되고 이 것이 최대 점수이다. 가장 높은 점수를 가지는 두 스티커
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n
출력
각 테스트 케이스 마다, 2n개의 스티커 중에서 두 변을 공유하지 않는 스티커 점수의 최댓값을 출력한다.
좌에서 우로 스티커를 떼는 과정에서 아래 두 가지 방법으로 스티커를 떼면서 점수의 합산을 구할 예정
1. 바로 옆 칸을 떼려면 위 아래가 달라서 서로 대각선 자리에 위치한 스티커를 뗄 수 있다. >> 지그재그 모양
2. 같은 윗줄 또는 아래줄의 스티커를 연속으로 사용하려면
다이나믹 알고리즘으로 위의 방법을 거꾸로 생각해서
현재 스티커를 뗄 때, 가능한 앞의 시나리오 중 최댓 합의 시나리오를 선택하는 코드를 짰다.
점수 합을 구하기 위해서 윗줄과 아래줄 각각 두 칸 정도의 정보를 저장하면 된다.
1. 현재 떼는 스티커가 위인지 아래인지에 따라 각각 점수합 리스트를 따로 생성한 코드
from sys import stdin
input = stdin.readline
def main():
T = int(input())
li = []
for _ in range(T):
n = int(input())
row1 = list(map(int, input().split()))
row2 = list(map(int, input().split()))
a = [row1[0], row2[0]]
b = [row1[0], row2[0]]
for i in range(1, n):
a, b = b, [row1[i] + max(b[1], a[1]),
row2[i] + max(b[0], a[0])]
li.append(max(b))
print("\n".join(map(str, li)))
if __name__ == "__main__":
main()
점수합 리스트를 2차원으로, 하나로 생성한 코드
from sys import stdin
input = stdin.readline
def main():
T = int(input())
li = []
for _ in range(T):
n = int(input())
if n > 1:
row1 = list(map(int, input().split()))
row2 = list(map(int, input().split()))
ans = [[row1[0], row2[0]],
[row1[1] + row2[0], row2[1] + row1[0]]]
for i in range(2, n):
ans = [ans[1],
[row1[i] + max(ans[1][1], ans[0][1]),
row2[i] + max(ans[1][0], ans[0][0])]]
li.append(max(ans[1]))
else:
li.append(max(int(input()), int(input())))
print("\n".join(map(str, li)))
if __name__ == "__main__":
main()
예제 입력 1
2
5
50 10 100 20 40
30 50 70 10 60
7
10 30 10 50 100 20 40
20 40 30 50 60 20 80
예제 출력 1
260
290
'IT > Python' 카테고리의 다른 글
[백준] 11659번 구간 합 구하기 4 [Python] - 누적 합 1 | 2023.10.25 |
---|---|
[백준] 1991번 트리 순회 [Python] - 재귀 1 | 2023.10.25 |
[백준] 1932번 정수 삼각형 [Python] - 다이나믹 1 | 2023.10.23 |
[백준] 1629번 곱셈 [Python] 1 | 2023.10.23 |