BOJ/๐Ÿฅ‡

โ˜…DP Advanced I - 4 Solvedโ˜…

metamong 2023. 1. 8.

โ˜… 2591 ์ˆซ์ž์นด๋“œ โ˜…

 

n=input()
l=len(n)

if l==1:print(1)
else:
    dp=[0]*l

    #dp-table initialization - dp[0], dp[1]

    dp[0]=1

    front_two=int(n[:2])
    if front_two <=34 and front_two not in [10,20,30]:dp[1]=2
    else:dp[1]=1

    #update dp-table - dp[2]~
    for i in range(2,l):
        if n[i] !='0': #last number is not 0
            dp[i]=dp[i-1]
            if 10 <= int(n[i-1:i+1]) <= 34:
                dp[i]+=dp[i-2]
        else: #last number is 0
            if int(n[i-1])>=4:
                dp[i]=0
            else:
                dp[i]=dp[i-2]
                
print(dp[-1])

 

๐Ÿ‘„ dp-table์„ ์ „ํ˜•์ ์ธ dp ์œ ํ˜• ๋‹ต๊ฒŒ updateํ•˜๋Š” ์œ ํ˜•์ด๋‚˜, ๋งจ ๋งˆ์ง€๋ง‰ ์ˆซ์ž๊ฐ€ 0์ผ ๊ฒฝ์šฐ์˜ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” dp ์œ ํ˜•!

 

๐Ÿ‘„

โ‘  ๊ธธ์ด๊ฐ€ 1์ธ ๊ฒฝ์šฐ - ์ˆซ์ž 1๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„ ์นด๋“œ 1๊ฐœ - dp[0] = 1

 

โ‘ก ๊ธธ์ด๊ฐ€ 2์ธ ๊ฒฝ์šฐ

(1) ์•ž์˜ ๋‘ ์ž๋ฆฌ ์ˆซ์ž๊ฐ€ 34์ดํ•˜์ด๋˜, 10, 20, 30์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์ˆซ์ž 1๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„ ์นด๋“œ 2๊ฐœ & ๋‘ ์ž๋ฆฌ ์ˆซ์ž ์นด๋“œ 1๊ฐœ - dp[1] = 2

(2) ์•ž์˜ ๋‘ ์ž๋ฆฌ ์ˆซ์ž๊ฐ€ ์œ„์˜ ์ผ€์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํ•œ ์ž๋ฆฌ ์ˆซ์ž ์นด๋“œ 2๊ฐœ ๊ฒฝ์šฐ ๋‹จ 1๊ฐ€์ง€ ๊ฒฝ์šฐ - dp[1] = 1

 

โ‘ข ๊ธธ์ด๊ฐ€ 3์ด์ƒ์ธ ๊ฒฝ์šฐ

 

(1) ๋งจ ๋งˆ์ง€๋ง‰ ์ˆซ์ž๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ

→ ๋งจ ๋งˆ์ง€๋ง‰ ๋‘ ์ˆซ์ž๊ฐ€ 10์ด์ƒ 34์ดํ•˜์ธ ๊ฒฝ์šฐ, ๋งˆ์ง€๋ง‰ ์ˆซ์ž๊ฐ€ 1๊ฐœ์˜ ์นด๋“œ๋กœ ์˜ค๋Š” ๊ฒฝ์šฐ + ๋งˆ์ง€๋ง‰ ๋‘ ๊ฐœ์˜ ์ˆซ์ž๊ฐ€ 1๊ฐœ์˜ ์นด๋“œ๋กœ ์˜ค๋Š” ๊ฒฝ์šฐ

 

dp[i] = dp[i-1] + dp[i-2]

 

→ ์œ„ ๋ฒ”์œ„์— ํ•ด๋‹น๋˜์ง€ ์•Š๋Š” ๋งˆ์ง€๋ง‰ ๋‘ ์ˆ˜๋ผ๋ฉด, ๋งˆ์ง€๋ง‰ ์ˆซ์ž๊ฐ€ 1๊ฐœ์˜ ์นด๋“œ๋กœ ์˜ค๋Š” ๊ฒฝ์šฐ๋งŒ ์ ์šฉ

 

dp[i] = dp[i-1]

 

(2) ๋งจ ๋งˆ์ง€๋ง‰ ์ˆซ์ž๊ฐ€ 0์ธ ๊ฒฝ์šฐ

→ ๋งจ ๋งˆ์ง€๋ง‰์˜ ์•ž์ž๋ฆฌ ์ˆซ์ž๊ฐ€ 4์ด์ƒ์ด๋ฉด, ๋งˆ์ง€๋ง‰ ๋‘ ์ž๋ฆฌ ์ˆซ์ž(40, 50, 60, 70, 80, 90)์€ ์ˆซ์ž์นด๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์œผ๋ฏ€๋กœ

 

dp[i] = 0

 

→ ๋งจ ๋งˆ์ง€๋ง‰์˜ ์•ž์ž๋ฆฌ ์ˆซ์ž๊ฐ€ 3์ดํ•˜๋ผ๋ฉด, ๋งˆ์ง€๋ง‰ ๋‘ ์ž๋ฆฌ ์ˆซ์ž(10, 20, 30)์€ ๋ฐ˜๋“œ์‹œ ํ•œ ๊ฐœ์˜ ์นด๋“œ์— ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ, ๋‘ ๊ณ„๋‹จ ์•ž์œผ๋กœ ๋›ด $dp[i-2]$์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ทธ ์ž์ฒด๋กœ ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.

 

dp[i] = dp[i-2]

 

๐Ÿ‘„ dp-table์„ ๋งŒ๋“ค๋˜, ๋ฌธ์ œ์˜ ํŠน์„ฑ ์ƒ 4๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด updateํ•ด์ค˜์•ผ ํ•˜๊ณ , initialization๋„ ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ํ•ด์ค˜์•ผ ํ•˜๋Š”, ๋ถ„๊ธฐ๊ฐ€ ๋งŽ์€ dp ์œ ํ˜•


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

 

import sys
input=sys.stdin.readline

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

dp=[[1,[A[i]]] for i in range(N)]

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

print(max(dp)[0])
print(*max(dp)[1])

 

๐Ÿ LIS์˜ ๊ธธ์ด์™€ LIS์˜ ์ˆ˜์—ด ๋‚ด์šฉ๊นŒ์ง€ ์ถœ๋ ฅํ•˜๋Š” LIS ์‘์šฉ ๋ฌธ์ œ. dp์— LIS ๊ธธ์ด ๋ฟ ์•„๋‹ˆ๋ผ LIS path๋ฅผ ๋‘๋ฒˆ์งธ list ์›์†Œ๋กœ ์ €์žฅํ•œ๋‹ค. ํ˜„์žฌ dp[x][0]์— ์ €์žฅ๋œ ๊ธธ์ด๋ณด๋‹ค ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋„๋Š” dp[y][0] + 1์ด ๋” ํด ๊ฒฝ์šฐ์—๋งŒ dp[x][0]๊ณผ dp[x][1] update. dp์— ๊ธธ์ด์™€ path๊นŒ์ง€ ๋„๋Š” ๋ฌธ์ œ


โ˜… 2565 ์ „๊นƒ์ค„ โ˜…

 

import sys
input=sys.stdin.readline

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

for _ in range(N):
    a,b=map(int,input().split())
    elec.append((a,b))

elec=sorted(elec, key=lambda x: (x[0]))

dp=[1]*N

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

 

๐Ÿ A ์ „๊นƒ์ค„๊ณผ B ์ „๊นƒ์ค„์ด ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด A ์ „๊นƒ์ค„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ ์‹œ, B ์ „๊นƒ์ค„์ด ๋™์ผํ•˜๊ฒŒ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ์ „๊นƒ์ค„์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š” B ์ „๊นƒ์ค„์˜ LIS length. A ์ „๊นƒ์ค„ + B ์ „๊นƒ์ค„ 2๊ฐœ์˜ ์ •๋ณด ๋“ค์–ด๊ฐ„ list๋ฅผ A ๊ธฐ์ค€ sortingํ•œ ๋’ค B ์ „๊นƒ์ค„์˜ LIS dp ์ง„ํ–‰


โ˜… 11054 ๊ฐ€์žฅ ๊ธด ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด โ˜…

import sys
input=sys.stdin.readline

N=int(input())

increase=list(map(int,input().split()))
decrease=increase[::-1]

dpi=[1]*N
dpd=[1]*N

for x in range(1,N):
    for y in range(0,x):
        if increase[y] < increase[x]:
            dpi[x] = max(dpi[x],dpi[y]+1)


for x in range(1,N):
    for y in range(0,x):
        if decrease[y] < decrease[x]:
            dpd[x] = max(dpd[x],dpd[y]+1)
dpd=dpd[::-1]

ans=0
for i in range(N):
    ans=max(ans,dpi[i]+dpd[i]-1)
print(ans)

 

๐Ÿ ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด

1 5 2 1 4 3 4 5 2 1

: ๊ฐ ์›์†Œ๋งˆ๋‹ค ์™ผ์ชฝ์—์„œ ์‹œ์ž‘ํ•˜๋Š” LIS์™€ ์˜ค๋ฅธ์ชฝ์—์„œ ์‹œ์ž‘ํ•˜๋Š” LIS์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. ์ด 2๊ฐœ์˜ ์–‘ ๋ฐฉํ–ฅ์—์˜ LIS๊ฐ€ ์ €์žฅ๋œ dpi, dpd์˜ ํ•ฉ - 1์ด ๊ฐ ์›์†Œ๋ฅผ ๊ธฐ์ ์œผ๋กœ ํ•˜๋Š” ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด. ๊ทธ ์ค‘ ์ตœ๋Œ“๊ฐ’์€ ๋‹น์—ฐํžˆ ๊ฐ€์žฅ '๊ธด' ๋ฐ”์ดํ† ๋‹‰ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ ๋œ๋‹ค.


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'BOJ > ๐Ÿฅ‡' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

โ˜…Greedy Upper-Advanced I - 1 Solvedโ˜…  (1) 2023.10.18
โ˜…BF Advanced I - 3 Solvedโ˜…  (0) 2023.10.06
โ˜…Greedy Advanced I - 4 Solvedโ˜…  (0) 2023.08.30
โ˜…Sorting Advanced I - 5 Solvedโ˜…  (0) 2023.07.28
โ˜…hashing ์ƒ๊ธ‰ - 1๋ฌธ์ œ()โ˜…  (0) 2022.11.06

๋Œ“๊ธ€