Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 9465] 스티커 (Python3) 본문

Problem Solving

[BOJ 9465] 스티커 (Python3)

흑개 2021. 2. 22. 23:15

www.acmicpc.net/problem/9465

 

9465번: 스티커

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

www.acmicpc.net

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
= int(input())
 
for _ in range(T):
    n = int(input())
    array=[]
    for _ in range(2):
        array.append(list(map(int, input().split())))
    dp=[[0]*for _ in range(2)]
    
    dp[0][0], dp[1][0]=array[0][0], array[1][0]
 
    if n>=2:
        dp[0][1], dp[1][1]=dp[1][0]+array[0][1], dp[0][0]+array[1][1]
 
    for i in range(2,n):
        for j in range(0,2):
            if j==0:
                dp[j][i]=max(dp[1][i-1], max(dp[0][i-2], dp[1][i-2]))+array[j][i]
            elif j==1:
                dp[j][i]=max(dp[0][i-1], max(dp[0][i-2], dp[1][i-2]))+array[j][i]
 
    print(max(dp[0][n-1], dp[1][n-1]))
 
cs

 

이것 역시 DP 문제. 오늘은 DP party!!(하삼 따라해봄 ㅎㅎ)

여기서 내가 고안해낸 점화식은

dp[0][i]=max(dp[1][i-1], max(dp[0][i-2], dp[1][i-2]))+array[0][i]

dp[1][i]=max(dp[0][i-1], max(dp[0][i-2], dp[1][i-2]))+array[1][i]

이다. 바로 max(전에 꺼+자기 꺼, 전전꺼+자기꺼) 를 나타낸다.

여기서 나는 전전꺼를 선택할 때 0행에 있는 것을 선택하든 1행에 있는 것을 선택하든 큰 걸 선택하도록 했는데.. 사실 이렇게 안해도 

1행에 있는 현재 값을 선택할 때 0행에 있는 전전값을 선택해야 하는 것이 바른 점화식이다. 즉 이렇게!!

dp[0][i] = max(dp[1][i-1], dpdp[1][i-2]) + arr[0][i]
dp[1][i] = max(dp[0][i-1], dpdp[0][i-2]) arr[1][i]

 

왜냐하면 1행에 있는 현재 값+1행에 있는 전전값 선택해봤자 .. 1행에 있는 전전값+0행에 있는 전값+1행에 있는 현재값 이 조합이 더 클 수 밖에 없으므로. 이렇게 바꿔주는게 계산 시간을 줄이는데 용이한 점화식이 된다.

'Problem Solving' 카테고리의 다른 글

[BOJ 3079] 입국심사 (Python3)  (0) 2021.02.24
[BOJ 2156] 포도주 시식 (Python3)  (0) 2021.02.23
[BOJ 1912] 연속합 (Python3)  (0) 2021.02.22
[BOJ 9019] DSLR (Python3)  (0) 2021.02.22
[BOJ 9012] 괄호 (Python3)  (0) 2021.02.20