โ 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 |
๋๊ธ