알고리즘(백준)/동적 계획법

[알고리즘/동적 계획법] 9465번 : 스티커 - python

되다 2023. 4. 6. 11:37

링크 : https://www.acmicpc.net/problem/9465

 

9465번: 스티커

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의

www.acmicpc.net

 


  • 문제
  • 소요시간: 실패

 


  • 설계하기(접근방법) 

1. 테스트 케이스와 리스트를 입력받는다

 

2. 알고리즘 해석

일반적으로 계속 대각선을 더해 나간다

리스트를 dp1, dp2 로 선언한다

 

1) 고려해야 할 사항 中 복잡한 것은 다음 대각선의 수를 포기하고, 다다음 대각선의 수를 더하는 경우, 선택을 하지 않고 넘어가는 경우의 수가 있다.

200 20 40  

120 10 60

-> 200 + 10 + 40 or 200 + X + 60

2) 먼저 1번째 인덱스와 대각선의 0번째 인덱스를 더한다.50 + 50, 30 + 10

 

3) 다음 인덱스부터는 이전의 dp를 더할지, 아니면 이전전의 dp를 더할지 값을 비교하여 그중 큰 값을 더한다.

max(dp[j] += max(dp[j-1], dp[j-2])

 

3. 두 리스트 중 max값을 출력한다.

 

 


  • 코드(출력)
import sys

input = sys.stdin.readline

t = int(input())

for i in range(t):
    n = int(input())
    dp1 = list(map(int, input().split()))
    dp2 = list(map(int, input().split()))
    for j in range(1, n):
        if j == 1:
            dp1[j] += dp2[j-1]
            dp2[j] += dp1[j-1]
        else:
            dp1[j] += max(dp2[j-1], dp2[j-2])
            dp2[j] += max(dp1[j-1], dp1[j-2])
    print(max(dp1[n-1], dp2[n-1]))

  • 얻어갈 부분

1. 점화식을 제대로 세우지 못했다. 풀이를 보고도 처음에는 잘 이해하지 못했다. dp를 기준으로 다음값을 비교하지 말고, 이전의 값을 비교하는 방식으로 접근하자