BOJ/๐Ÿฅˆ

โ˜…DP Upper-Intermediate I - 15 Solvedโ˜…

metamong 2023. 1. 3.

โ˜… 2579 ๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ โ˜…

 

# dp 1์ฐจ์› ๋ฐฐ์—ด

import sys
input=sys.stdin.readline

N=int(input())
S=[0]

for _ in range(N):S.append(int(input()))

if N==1:print(S[1])
elif N==2:print(S[1]+S[2])
elif N==3:print(S[3]+max(S[1],S[2]))
else:
    dp=[0]*(N+1)

    dp[1]=S[1]
    dp[2]=S[1]+S[2]
    dp[3]=S[3]+max(dp[1],S[2])
    for i in range(4,N+1):
        dp[i]=S[i]+max(dp[i-2],dp[i-3]+S[i-1])
    print(dp[-1])

 

 

๐Ÿคก ํ•œ๋ฒˆ์— ํ•œ ๊ณ„๋‹จ, ๋‘ ๊ณ„๋‹จ์„ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด์€ ์—ฐ์†ํ•ด์„œ ์„ธ๋ฒˆ ์ด์ƒ ํ•œ ๊ณ„๋‹จ์„ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋Š” ์ . ๋”ฐ๋ผ์„œ a(n)์„ n๋ฒˆ์งธ ๊ณ„๋‹จ๊นŒ์ง€ ์˜ค๋ฅด๋Š” ์ตœ๊ณ  ์ ์ˆ˜๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, ๋‹จ์ˆœํžˆ a(n-1)+a(n-2)๋ผ๊ณ  ์ ํ™”์‹์„ ๋งŒ๋“ค์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค. n๋ฒˆ์งธ ๊ณ„๋‹จ์„ S(n)์ด๋ผ๊ณ  ํ•˜๋ฉด, S(n-2)์—์„œ ํ•œ ๋ฒˆ์— ๋‘ ๊ณ„๋‹จ ์˜ฌ๋ผ๊ฐ€ S(n)์— ๋„๋‹ฌํ•˜๋Š” a(n-2)๋Š” ๋ฐ”๋กœ ๋”ํ•˜๊ธฐ ๊ฐ€๋Šฅ (์•„๋ž˜ ๋นจ๊ฐ„์ƒ‰). ํ•˜์ง€๋งŒ a(n-1)์˜ ๊ฒฝ์šฐ, S(n-1)์—์„œ ํ•œ ๋ฒˆ์— ํ•œ ๊ณ„๋‹จ์œผ๋กœ S(n)์œผ๋กœ ์˜ฌ๋ผ๊ฐ€๋ ค๋ฉด S(n-2)๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ˜๋“œ์‹œ S(n-3)์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ a(n-3) ์ ์ˆ˜์—์„œ S(n-1)์„ ๊ฑฐ์น˜๋Š”, a(n-3) + S(n-1)๋กœ ์ •๋ฆฌ๋  ์ˆ˜ ์žˆ์Œ (์•„๋ž˜ ํŒŒ๋ž€์ƒ‰). ์ ํ™”์‹ ์ •๋ฆฌํ•˜๋ฉด a(n) = S(n) + max(a(n-2), a(n-3)+S(n-1))

 


# dp 2์ฐจ์› ๋ฐฐ์—ด

import sys
input=sys.stdin.readline

N=int(input())
S=[0]
D=[[0,0,0] for _ in range(N+1)]
for _ in range(N):S.append(int(input()))

#initialization
D[1][1] = S[1]
D[1][2] = 0

if N>=2:
    D[2][1] = S[2]
    D[2][2] = S[1]+S[2]

for k in range(3,N+1):
    D[k][1] = max(D[k-2][1],D[k-2][2])+S[k]
    D[k][2] = D[k-1][1]+S[k]

print(max(D[N]))

 

๐Ÿคก ํ˜„์žฌ ์œ„์น˜ ๊ณ„๋‹จ์„ ์˜ค๋ฅด๋Š” ๊ฒฝ์šฐ๋Š” ์•„๋ž˜ ๊ณ„๋‹จ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์˜ฌ๋ผ์˜ค๋Š” ๊ฒฝ์šฐ + ์•„๋ž˜ ๊ณ„๋‹จ์„ ๊ฑฐ์น˜๊ณ  ์˜ฌ๋ผ์˜ค๋Š” ๊ฒฝ์šฐ 2๊ฐ€์ง€ ์ผ€์ด์Šค ์กด์žฌ. ์ด๋ฅผ ๊ฐ๊ฐ D[x][1]๊ณผ D[x][2]๋กœ ๋‚˜๋ˆ„์–ด ๋ˆ„์ ์œผ๋กœ dp ํ˜•์‹์œผ๋กœ ๋”ํ•ด๋‚˜๊ฐ„ ๋’ค, ์ตœ์ข…์ ์œผ๋กœ max(D[N]) ์—ฐ์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์กด์žฌ. D[x][1]์€ ์•„๋ž˜๊ณ„๋‹จ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์˜ฌ๋ผ์˜ค๋Š” ๊ฒฝ์šฐ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, ์•„๋ž˜์—์„œ ๋‘๋ฒˆ์งธ ๊ณ„๋‹จ์€ ๋ฐ˜๋“œ์‹œ ๊ฑฐ์ณ์•ผ ํ•จ. ๋”ฐ๋ผ์„œ D[x-2]์˜ ์ตœ๋Œ“๊ฐ’ + ํ˜„์žฌ ๊ณ„๋‹จ S[x]๊ฐ€ ์ •๋‹ต / D[x][2]๋Š” ์•„๋ž˜๊ณ„๋‹จ์„ ๊ฑฐ์น˜๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ ๋ฐ”๋กœ max(D[x-1]) + S[k]๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, D[x-1][2]๋Š” ์•„๋ž˜์—์„œ ๋‘๋ฒˆ์งธ ๊ณ„๋‹จ์„ ๊ฑฐ์น˜๊ณ  ์˜ฌ๋ผ์˜จ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ D[x-1][1]๋งŒ ๊ณ ๋ ค. ๋”ฐ๋ผ์„œ D[x-1][1] + S[x]๊ฐ€ ์ •๋‹ต. 

 


โ˜… 1932 ์ •์ˆ˜ ์‚ผ๊ฐํ˜• โ˜…

 

import sys
input=sys.stdin.readline

n=int(input())
l=[]

for _ in range(n):l.append(list(map(int,input().split())))

for i in range(1,n):
    l[i][0]+=l[i-1][0]
    for k in range(1,i):l[i][k]+=max(l[i-1][k-1],l[i-1][k]) #dp
    l[i][i]+=l[i-1][i-1]

print(max(l[-1]))

 

๐Ÿคก ์ •์ˆ˜ ์‚ผ๊ฐํ˜• ๋ฌธ์ œ๋Š” ์ตœ๋Œ€ ํ•ฉ์˜ ๊ฒฝ๋กœ ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋กœ, ๊ฐ ์ธต๋ณ„๋กœ ์œ„์˜ ์ธต๊นŒ์ง€ ๊ตฌํ•œ ๋ˆ„์ ํ•ฉ์—์„œ ๊ฐ ์ˆ˜๋ณ„๋กœ ๋ชจ๋‘ ๋”ํ•ด์ง„ ์ˆ˜๋“ค์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š”, ์ „ํ˜•์ ์ธ dp ๋ฌธ์ œ dp-table 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ , ๊ฐ ์ธต ๊ธฐ์ค€ ๋งจ ์ฒซ๋ฒˆ์งธ์™€ ๋งจ ๋์˜ ์›์†Œ๋Š” ํ•ด๋‹น ์œ„์น˜์˜ ์ˆ˜ + ๋ฐ”๋กœ ์œ„ ์ธต์˜ ์ˆ˜์ด๊ณ , ๊ทธ ๊ฐ€์šด๋ฐ ์ˆ˜๋“ค์€ ์œ„ ๋‘ ์ˆ˜ ์ค‘ ์ตœ๋Œ“๊ฐ’์— ํ•ด๋‹น ์œ„์น˜์˜ ์ˆ˜๋ฅผ ๋”ํ•œ ๊ฒฐ๊ณผ l[i][k] = max(l[i-1][k-1], l[i-1][k]) + l[i][k] dp๋กœ ์ญ‰ update๋˜๋ฉด์„œ, ๋งจ ๋งˆ์ง€๋ง‰ ์ธต์˜ ์ตœ๋Œ“๊ฐ’์ด ์ •๋‹ต. ์ถ”๊ฐ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์  ์‚ฌ์šฉ์„ ์œ„ํ•ด ํฐ ์ˆ˜๊ฐ€ ์ž…๋ ฅ๋  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด, ๋ณ„๋„์˜ dp-table ์ƒ์„ฑ ์—†์ด ๊ธฐ์กด list์— update ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ‘ธ๋Š”๊ฒŒ ๋” ํšจ์œจ์ ! 


โ˜… 1912 ์—ฐ์†ํ•ฉ โ˜… - Kadane's Algorithm

 

import sys
input=sys.stdin.readline
n=int(input())
l=list(map(int,input().split()))
for i in range(1,n):
    l[i]=max(l[i],l[i]+l[i-1])
print(max(l))

 

๐Ÿคก ์ฃผ์–ด์ง„ ์ˆ˜์—ด์˜ ๋ถ€๋ถ„ ์—ฐ์†ํ•ฉ ์ตœ๋Œ€๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ. dp[n]์€ โ‘ n์›์†Œ ์ž์ฒด โ‘กn์›์†Œ + ์•ž์˜ dp[n-1] ๋‘ ๊ฐ€์ง€ ์ค‘ ์ตœ๋Œ€ ํ•ฉ์ด๋ผ๋Š” ์ ํ™”์‹ ์‚ฌ์šฉ dp[n] = max(dp[n-1], L[n]+dp[n-1]) Kadane's Algorithm์œผ๋กœ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ์ผ๋ถ€ ๋ฐฐ์—ด ์ตœ๋Œ€ํ•ฉ์„ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. (Kadane's Algorithm ํฌ์ŠคํŒ… ์ฐธ์กฐ)


โ˜… 15645 ๋‚ด๋ ค๊ฐ€๊ธฐ 2 โ˜…

 

- ํ’€์ด 1 -

import sys
input=sys.stdin.readline

N=int(input())
l=[]
for _ in range(N):
    a,b,c=map(int,input().split())
    l.append([a,b,c])

#find max
dp_max=[l[0]]

for i in range(N-1):
    a,b,c=dp_max[i][0],dp_max[i][1],dp_max[i][2]
    dp_max.append([l[i+1][0]+max(a,b), l[i+1][1]+max(a,b,c), l[i+1][2]+max(b,c)])

#find min
dp_min=[l[0]]

for i in range(N-1):
    a,b,c=dp_min[i][0],dp_min[i][1],dp_min[i][2]
    dp_min.append([l[i+1][0]+min(a,b), l[i+1][1]+min(a,b,c), l[i+1][2]+min(b,c)])

print(max(dp_max[-1]),min(dp_min[-1]))

 

- ํ’€์ด 2 -

import sys
input=sys.stdin.readline

N=int(input())
l = list(map(int,input().split()))
dp_max = l
dp_min = l

for i in range(N-1):
    a,b,c=map(int,input().split())
    dp_max=[a+max(dp_max[0],dp_max[1]), b+max(dp_max), c+max(dp_max[1],dp_max[2])]
    dp_min=[a+min(dp_min[0],dp_min[1]), b+min(dp_min), c+min(dp_min[1],dp_min[2])]

print(max(dp_max),min(dp_min))

 

๐Ÿคก ๋™์ผ dp ํ’€์ด์—ฌ๋„, ์ฃผ์–ด์ง„ dp-table์„ ๊ธฐ์กด ์›์†Œ ์ž๋ฆฌ์— updateํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜๋Š” ํ’€์ด 2 ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. dp ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ, ๊ธฐ์กด dp-table ๊ฐ’๋“ค์ด ์ตœ์ข… ๋‹ต์„ ๊ตฌํ•˜๋Š” ๊ณผ์ •์— ์—ฐ๊ด€๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๊ทธ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ์–ด๊ฐ€๋ฉฐ updateํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ’€์ด ์‹œ๊ฐ„์„ ํ›จ์”ฌ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์Œ. ์„ธ ๊ฐœ์˜ ์ˆ˜ ๊ฐ๊ฐ ์œ„์˜ ์ˆ˜์—์„œ ๋‚ด๋ ค์˜ค๋Š” ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ ์ค‘, ์ตœ๋Œ€ ๋˜๋Š” ์ตœ์†Œ๋ฅผ ๊ฐ๊ฐ ํŒ๋ณ„ํ•ด dp-table ์›๋ž˜๊ฐ’์— ๊ณ„์† update


โ˜… 17626 Four Squares โ˜…

 

<1> BF

n=int(input())
end=int(n**(1/2))
if n**(1/2)==end:print(1)
else:
    flag=0
    #check if ans is 2
    for i in range(end,0,-1):
        part=(n-i**2)
        part_root=part**(1/2)
        if part_root==int(part_root):
            flag+=1
            print(2)
            break
    if flag==0:
        #check if ans is 3
        for i in range(end,0,-1):
            part=(n-i**2)
            endp=int(part**(1/2))
            for j in range(endp,0,-1):
                partp=(part-j**2)
                partp_root=partp**(1/2)
                if partp_root==int(partp_root):
                    flag+=1
                    print(3)
                    break
            if flag==1:break
    if flag==0:print(4)

 

<2> DP

n=int(input())
dp=[0]*(n+1)
end = int((n-1)**(1/2))

num_squares = int(n**(1/2))

for i in range(1,num_squares+1):
    dp[i**2]=1

for i in range(1,n):
    for j in range(1,end+1):
        if ((i+j**2)<=n):
            if dp[i+j**2] != 0:
                dp[i+j**2] = min(dp[i+j**2],dp[i]+1)
            else: dp[i+j**2] = dp[i]+1

print(dp[-1])

 

n=int(input())
dp=[0,1]

for i in range(2,n+1):
    m_v,j=5,1
    
    while (j**2)<=i:
        m_v=min(m_v,dp[i-j**2])
        j+=1
    dp.append(m_v+1)
print(dp[n])

 

๐Ÿคก ๋ชจ๋“  ์ž์—ฐ์ˆ˜๋Š” 4๊ฐœ ์ดํ•˜์˜ ์ œ๊ณฑ์ˆ˜๋“ค์˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ๊ทธ๋ž‘์ฃผ์˜ ์ด๋ก  ๋ฌธ์ œ. ๋ผ๊ทธ๋ž‘์ฃผ์˜ ์ด๋ก ์„ ์•ˆ ์ƒํƒœ์—์„œ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ํ’€์ด์ด๋‹ค. ๋จผ์ € ์ œ๊ณฑ์ˆ˜์ธ์ง€ ํ™•์ธ, ๊ทธ ๋‹ค์Œ 2๊ฐœ์˜ ์ œ๊ณฑ์ˆ˜๋กœ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€, ์•„๋‹ˆ๋ฉด 3๊ฐœ, ๊ทธ๊ฒƒ๋„ ์•„๋‹ˆ๋ผ๋ฉด 4๊ฐœ๋กœ BF ๋ฐฉ์‹์œผ๋กœ ์ผ์ผ์ด ํ™•์ธ. BF๋Š” ์•„๋ž˜ 1๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ œ๊ณฑ์ˆ˜๋ฅผ ๋”ํ•˜๋ฉด์„œ ํ•ด๋‹น dp-table์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด, ์ด ์ค‘ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ update, ๊ฐ’์ด ์—†๋‹ค๋ฉด(0์ด๋ผ๋ฉด) ์ถœ๋ฐœ์ ์—์„œ 1์„ ๋”ํ•œ ๊ฐ’์„ ๋„ฃ๋Š” dp-table update ๋ฐฉ์‹. DP๋Š” ๋ฐ˜๋Œ€๋กœ 1๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์‚ดํŽด๋ณด๋˜, ์—ฌ๋Ÿฌ ์ œ๊ณฑ์ˆ˜๋ฅผ ๋นผ๋ฉด์„œ, ์ œ๊ณฑ์ˆ˜ ๋บ€ ๊ฒฐ๊ณผ์˜ ํ•ด๋‹น dp-table ๊ฐ’ ์ค‘ ์ตœ์†Ÿ๊ฐ’์— 1์„ ๋”ํ•œ ๊ฐ’์„ ๋„ฃ์€ dp-table update ๋ฐฉ์‹

 

∴ BF ๋ฐฉ์‹์ด ์›”๋“ฑํžˆ ๋นจ๋ž์œผ๋ฉฐ, DP๋Š” ์ผ์ผ์ด ๋ชจ๋“  ์›์†Œ๋ฅผ ํ™•์ธํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆผ


โ˜… 1699 ์ œ๊ณฑ์ˆ˜์˜ ํ•ฉ โ˜…

 

๐Ÿคก ์œ„ 17626๋ฒˆ ๋ฌธ์ œ์™€ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ - ๋ผ๊ทธ๋ž‘์ฃผ์˜ ์ œ๊ณฑ์ˆ˜ ์ด๋ก  -


โ˜… 1309 ๋™๋ฌผ์› โ˜…

 

n = int(input())

dp = [0] * 100001
dp[1] = 3
dp[2] = 7

for i in range(3, n+1):
    dp[i] = (2 * dp[i - 1] + dp[i - 2]) % 9901

print(dp[n])

 

๐Ÿคก ์ด 3๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.

โ‘  ๋ฐ”๋กœ ์œ— ์ค„์— ์‚ฌ์ž๊ฐ€ ํ•œ ๋งˆ๋ฆฌ๋„ ์—†์„ ๋•Œ a(n-1)

โ‘ก ๋ฐ”๋กœ ์œ— ์ค„์— ์™ผ์ชฝ์—๋งŒ ์‚ฌ์ž๊ฐ€ ํ•œ ๋งˆ๋ฆฌ ์žˆ์„ ๋•Œ b(n-1)

โ‘ข ๋ฐ”๋กœ ์œ— ์ค„์— ์˜ค๋ฅธ์ชฝ์—๋งŒ ์‚ฌ์ž๊ฐ€ ํ•œ ๋งˆ๋ฆฌ ์žˆ์„ ๋•Œ c(n-1)

→ ์ ํ™”์‹ x(n-1) = a(n-1) + b(n-1) + c(n-1). n๋ฒˆ์งธ ์ค„์—์„œ ๊ฐ๊ฐ์˜ a(n), b(n), c(n)์„ ๊ตฌํ•˜๋ฉด

 

โ‘  a(n) = a(n-1) + b(n-1) + c(n-1)

→ n๋ฒˆ์งธ ์ค„์— ์‚ฌ์ž๊ฐ€ ํ•œ ๋งˆ๋ฆฌ๋„ ์—†๋‹ค๋ฉด ์œ— ์ค„๊นŒ์ง€์˜ ๋ชจ๋“  ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ•ฉํ•œ ๊ฒฐ๊ณผ

โ‘ก b(n) = a(n-1) + c(n-1)

→ n๋ฒˆ์งธ ์ค„์˜ ์™ผ์ชฝ์—๋งŒ ์‚ฌ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด, ์œ— ์ค„์— ์‚ฌ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ + ์œ— ์ค„์— ์‚ฌ์ž๊ฐ€ ์˜ค๋ฅธ์ชฝ์—๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜

โ‘ข c(n) = a(n-1) + b(n-1)

→ n๋ฒˆ์งธ ์ค„์˜ ์˜ค๋ฅธ์ชฝ์—๋งŒ ์‚ฌ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด, ์œ— ์ค„์— ์‚ฌ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ + ์œ— ์ค„์— ์‚ฌ์ž๊ฐ€ ์™ผ์ชฝ์—๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜

 

โ€ป ์ด ๋•Œ a(n-1)์€ ์œ„ ์ ํ™”์‹์— ์˜ํ•ด a(n-2) + b(n-2) + c(n-2) = x(n-2) (n≥3)์ด๋ฏ€๋กœ x(n) = a(n) + b(n) + c(n) = (a(n-1) + b(n-1) + c(n-1) + (a(n-1) + c(n-1)) + (a(n-1)+b(n-1)) = x(n-1) + a(n-1) + (a(n-1) + b(n-1) + c(n-1)) = x(n-1) + a(n-1) + x(n-1) = 2x(n-1) + x(n-2)

 

โ€ป  ์ตœ์ข… ์ ํ™”์‹ ํ•œ ์ค„. ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ชผ๊ฐœ ๊ฐ๊ฐ์˜ ์ ํ™”์‹์„ ๊ตฌํ•œ ๋’ค, ํ•ฉ์นœ ์ ํ™”์‹์„ ๊ตฌํ•œ๋‹ค. 9901๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์›ํ•˜๋ฏ€๋กœ, ๋งค ๋ฒˆ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ชจ๋“  ์ˆ˜๋ฅผ 9901๋กœ ๋‚˜๋ˆ„๋ฉด์„œ ๊ณ„์† ์ง„ํ–‰


โ˜… 9465 ์Šคํ‹ฐ์ปค โ˜…

 

import sys
input=sys.stdin.readline

T=int(input())
for _ in range(T):
    n=int(input())
    sticker=[[0,0] for _ in range(n)]
    x,y=list(map(int,input().split())),list(map(int,input().split()))
    for i in range(n):
        sticker[i][0], sticker[i][1] = x[i], y[i]
    
    dp=[[0,0,0] for _ in range(n)]
    
    dp[0] = [0,sticker[0][0],sticker[0][1]]

    for i in range(1,n):
        dp[i][0] = max(dp[i-1][1],dp[i-1][2])
        dp[i][1] = max(dp[i-1][0],dp[i-1][2]) + sticker[i][0]
        dp[i][2] = max(dp[i-1][0],dp[i-1][1]) + sticker[i][1]

    print(max(dp[-1]))

 

๐Ÿคก dp 2์ฐจ์› ๋ฐฐ์—ด: dp[i][0]์€ i๋ฒˆ์งธ ์ž๋ฆฌ์— ์•„๋ฌด ์šฐํŽธ์ด ๋ฐฐ์น˜๋˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ์ตœ๋Œ“๊ฐ’ / dp[i][1]์€ ์œ„์˜ ์šฐํŽธ์ด ๋ฐฐ์น˜๋˜์—ˆ์„ ๋•Œ์˜ ์ตœ๋Œ“๊ฐ’ / dp[i][2]๋Š” ์•„๋ž˜ ์šฐํŽธ์ด ๋ฐฐ์น˜๋˜์—ˆ์„ ๋•Œ์˜ ์ตœ๋Œ“๊ฐ’ / ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ์œ„ ์„ธ๊ฐ€์ง€ ๊ฒฝ์šฐ ์ค‘ ์ตœ๋Œ“๊ฐ’


โ˜… 1149 RGB ๊ฑฐ๋ฆฌ โ˜…

 

import sys
input=sys.stdin.readline

N=int(input())
colors=[]

for _ in range(N):
    colors.append(list(map(int,input().split())))

#dp-initialization
dp=[[0,0,0] for _ in range(N)]
dp = colors

for i in range(1,N):
    dp[i][0] = dp[i][0] + min(dp[i-1][1],dp[i-1][2])
    dp[i][1] = dp[i][1] + min(dp[i-1][0],dp[i-1][2])
    dp[i][2] = dp[i][2] + min(dp[i-1][0],dp[i-1][1])

print(min(dp[-1]))

 

๐Ÿคก ๋ฌธ์ œ๋ฅผ ์š”์•ฝํ•˜์ž๋ฉด, RGB๋ฅผ ์ƒ‰์น ํ•  ๋•Œ ์ด์›ƒํ•œ node๋ผ๋ฆฌ ๋™์ผํ•œ ์ƒ‰์œผ๋กœ๋งŒ ์น ํ•˜์ง€ ์•Š์œผ๋ฉด ๋œ๋‹ค. dp๋ฅผ ์ƒ๊ฐํ•  ๋•Œ sub-problems๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ์ง€์˜ ์œ ๋ฌด + ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ sub-problems์˜ ํ•ฉ์ง‘ํ•ฉ์ด ์ „์ฒด ์ง‘ํ•ฉ์„ ์ฐจ์ง€ํ•˜๋Š” ์ง€์˜ ์œ ๋ฌด๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. dp-table์—์„œ ํ˜„์žฌ ์ฑ„์šฐ๋Š” ์—ด ๊ธฐ์ค€ ์œ„์˜ ์—ด์ด R์„ ๊ณจ๋ž์„ ๋•Œ + G๋ฅผ ๊ณจ๋ž์„ ๋•Œ + B๋ฅผ ๊ณจ๋ž์„ ๋•Œ์˜ ์ด 3๊ฐ€์ง€ sub-problem์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด 3๊ฐœ์˜ sub-problem์˜ ํ•ฉ์ง‘ํ•ฉ์€ ์ „์ฒด problem์œผ๋กœ ํ˜•์„ฑ. ์ตœ์ข… update๋œ ๋งˆ์ง€๋ง‰ ์—ด์˜ ์ตœ์†Ÿ๊ฐ’์ด ๊ณง ์ •๋‹ต

๋”๋ณด๊ธฐ

๋ผํ…์Šค ๋ฌธ๋ฒ•(์˜ˆ๋น„์šฉ) 

$$C(N) = \begin{Bmatrix}
C(N)[0] + min(C(N-1)[1],C(N-1)[2])\\
C(N)[1] + min(C(N-1)[0],C(N-1)[2])) \\
C(N)[2] + min(C(N-1)[0],C(N-1)[1]))
\end{Bmatrix}$$


โ˜… 2156 ํฌ๋„์ฃผ ์‹œ์‹ โ˜…

 

import sys
input=sys.stdin.readline
n=int(input())
gs=[]
for _ in range(n):gs.append(int(input()))

if n==1:print(gs[0])
elif n==2:print(gs[0]+gs[1])
else:
    dp=[[0,0,0,0] for _ in range(n-1)]
    dp[0]=[0,gs[1],gs[0],gs[0]+gs[1]]
    for x in range(1,n-1):
        dp[x][0]=dp[x-1][2]
        dp[x][1]=max(dp[x-1][0],dp[x-1][2])+gs[x+1]
        dp[x][2]=max(dp[x-1][1],dp[x-1][3])
        dp[x][3]=dp[x-1][1]+gs[x+1]
    print(max(dp[-1]))

 

๐Ÿคก ํฌ๋„์ฃผ ๋งˆ์‹œ๋Š” ์œ ํ˜•์€ ์ด์ „ ๋‘ ๊ฐœ์˜ ํฌ๋„์ฃผ๋ฅผ ๋งˆ์‹  ๊ฒฝ์šฐ๊ฐ€ OO, OX, XO, XX์ธ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. (n 2 ์ดํ•˜์ธ ๊ฒฝ์šฐ ์ œ์™ธ). dp๋ฅผ 4๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ทธ ๋‹ค์Œ ์ผ€์ด์Šค์— O์™€ X๋ฅผ ๋‚˜๋ˆ„์–ด ๋‹ค์‹œ OO, OX, XO, XX์ธ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆˆ๋‹ค.

 

(1) XX๋Š” XXO / XXX ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‚˜ XXX๋Š” ํฌ๋„์ฃผ๋ฅผ ์ตœ๋Œ€๋กœ ๋งˆ์‹ ๋‹ค๋Š” ์กฐ๊ฑด์—์„œ ์ œ์™ธ

(2) XO๋Š” XOO / XOX ๋ชจ๋‘ ๊ฐ€๋Šฅ

(3) OX๋Š” OXO / OXX ๋ชจ๋‘ ๊ฐ€๋Šฅ

(4) OO๋Š” OOX๋งŒ ๊ฐ€๋Šฅ

 

์ฆ‰, XX๋Š” ์•ž์„  (3) / XO๋Š” ์•ž์„  (1)๊ณผ (3)์˜ ์ตœ๋Œ“๊ฐ’ + ํ•ด๋‹น ์œ„์น˜ ํฌ๋„์ฃผ / OX๋Š” ์•ž์„  (2)์™€ (4)์˜ ์ตœ๋Œ“๊ฐ’ / XX๋Š” ์•ž์„  (2) + ํ•ด๋‹น ์œ„์น˜ ํฌ๋„์ฃผ

๋งˆ์ง€๋ง‰ dp 4๊ฐ€์ง€ ๊ฒฝ์šฐ ์ค‘ ์ตœ๋Œ“๊ฐ’ ์ถœ๋ ฅ


โ˜… 9184 ์‹ ๋‚˜๋Š” ํ•จ์ˆ˜ ์‹คํ–‰ โ˜…

import sys
input=sys.stdin.readline

dp=[[[1]*21 for _ in range(21)] for _ in range(21)]

for i in range(1,21):
    for j in range(1,21):
        for k in range(1,21):
            if i < j < k:
                dp[i][j][k] = dp[i][j][k-1] + dp[i][j-1][k-1] - dp[i][j-1][k]
            else:
                dp[i][j][k] = dp[i-1][j][k] + dp[i-1][j-1][k] + dp[i-1][j][k-1] - dp[i-1][j-1][k-1]

while 1:
    a,b,c=map(int,input().split())
    if (a,b,c) == (-1,-1,-1):
        break
    if a<=0 or b<=0 or c<=0:
        print(f'w({a}, {b}, {c}) = 1')
    else:
        if a > 20 or b > 20 or c > 20:
            print(f'w({a}, {b}, {c}) = {dp[20][20][20]}')
        else:
            print(f'w({a}, {b}, {c}) = {dp[a][b][c]}')

 

๐Ÿคก 3์ฐจ์› dp๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฌธ์ œ. ์œ„ ์ฃผ์–ด์ง„ ์ ํ™”์‹ ๋Œ€๋กœ ๊ฐ๊ฐ ๊ตฌํ•œ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ์˜ ์žฌ๊ท€ ๋Œ€์‹  ์™œ DP ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š” ์ง€ ์•Œ๋ ค์ฃผ๋Š” ๋ฌธ์ œ. ๋‹ค๋งŒ ๋ณ€์ˆ˜๊ฐ€ 3๊ฐœ์ด๋ฏ€๋กœ 3์ฐจ์› list๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ๋งŒ ์ฃผ์˜


โ˜… 11053 ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด โ˜…

 

import sys
input=sys.stdin.readline

N=int(input())
A=list(map(int,input().split()))

dp=[1]*N

for x in range(1,N):
    for y in range(x):
        if A[y]<A[x]:
            dp[x] = max(dp[x],dp[y]+1)
print(max(dp))

 

๐Ÿ ์ „ํ˜•์ ์ธ LIS ์•Œ๊ณ ๋ฆฌ์ฆ˜. dp-table 1 initialization


โ˜… 11722 ๊ฐ€์žฅ ๊ธด ๊ฐ์†Œํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด โ˜…

 

๐Ÿ  LIS์—์„œ ๋ถ€๋“ฑํ˜ธ๋งŒ ๋ฐ”๊พธ๋ฉด Longest Decreasing Subsequence ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณ€์‹ 

import sys
input=sys.stdin.readline

N=int(input())
A=list(map(int,input().split()))

dp=[1]*N

for x in range(1,N):
    for y in range(x):
        if A[y] > A[x]:
            dp[x] = max(dp[x], dp[y]+1)

print(max(dp))

โ˜… 11055 ๊ฐ€์žฅ ํฐ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด โ˜…

import sys
input=sys.stdin.readline
N=int(input())
A=list(map(int,input().split()))

dp=A[::]

for x in range(1,N):
    for y in range(x):
        if A[x] > A[y]:
            dp[x]=max(dp[x],A[x]+dp[y])
print(max(dp))

 

๐Ÿ LIS ๋ณ€ํ˜• ๋ฌธ์ œ. ๊ธธ์ด๊ฐ€ ์•„๋‹ˆ๋ผ Subsequence sum์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ max(dp[x], dp[y]+1)์ด ์•„๋‹Œ, max(dp[x], dp[y]+A[x])๋กœ dp[y]๊นŒ์ง€์˜ ์ตœ๋Œ€ํ•ฉ + ํ˜„์žฌ ์œ„์น˜์˜ ์›์†Œ ํ•ฉ ๊ฒฐ๊ณผ๋ฅผ dp update.

 

๐Ÿ  ์ถ”๊ฐ€๋กœ ์ฃผ์˜ํ•  ๋ถ€๋ถ„.dp=A๋ผ ํ•˜๋ฉด dp update ์‹œ A๋„ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ์— update ๋œ๋‹ค. dp = A[::]๋กœ ๋ณต์ œ๋ณธ์„ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ


โ˜… 18353 ๋ณ‘์‚ฌ ๋ฐฐ์น˜ํ•˜๊ธฐ โ˜…

 

import sys
input=sys.stdin.readline

n=int(input())
s=list(map(int,input().split()))

dp=[1]*n

for x in range(1,n):
    for y in range(x):
        if s[x]<s[y]:
            dp[x]=max(dp[x],dp[y]+1)
print(n-max(dp))

 

๐Ÿ Longest Decreasing Subsequence์˜ ๊ธธ์ด ์ œ์™ธ ๋‚˜๋จธ์ง€ ๋ณ‘์‚ฌ ์ธ์›์ˆ˜ ์ถœ๋ ฅ


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€