โ 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์ ๊ธธ์ด ์ ์ธ ๋๋จธ์ง ๋ณ์ฌ ์ธ์์ ์ถ๋ ฅ
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Stack & Queue & Deque Upper-Intermediate I - 11 Solvedโ (0) | 2023.01.08 |
---|---|
โ Bitmasking Intermediate I - 3 Solvedโ (0) | 2023.01.05 |
โ DP Intermediate I - 20 Solvedโ (0) | 2022.12.22 |
โ Sorting Upper-Intermediate I - 6 Solvedโ (1) | 2022.12.20 |
โ Number Theory Intermediate I - 17 Solvedโ (0) | 2022.12.13 |
๋๊ธ