๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
CodingTest

[Python] DP, ๋™์ ๊ณ„ํš๋ฒ•

by ๋„์บ๋ฆฌ๐Ÿฑ 2021. 5. 19.
๋ฐ˜์‘ํ˜•

DP, ๋™์ ๊ณ„ํš๋ฒ•

>>  ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ์ชผ๊ฐœ์„œ ๋” ํฐ ๋ฌธ์ œ์˜ ๋‹ต์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณต ํ•˜๋Š” ํŒจ๋Ÿฌ๋‹ค์ž„ (๋ถ„ํ• ์ •๋ณต๊ณผ ๋น„์Šทํ•˜๋‹ค)

 

๋ถ„ํ•  ์ •๋ณต๊ณผ DP ์˜ ์ฐจ์ด๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค. 

๋ถ„ํ•  ์ •๋ณต๊ณผ DP์˜ ์ฐจ์ด๋ฅผ  ๊ทธ๋ฆผ์œผ๋กœ.

 

 

 

Memoization ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ํ•œ ๋ฒˆ ๊ตฌํ•œ ๋‹ต๋“ค์€ ์ €์žฅํ•ด๋‘์ž!

>> ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์˜ ๋‹ต์„ ์ „์—ญ ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ ๊ฐ™์€ ๊ฒƒ์— ๋„ฃ๊ณ  ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ๊บผ๋‚ด ์จ์•ผ ํ•œ๋‹ค.

 

 

Top-down ? Bottom-Up?

Top-down Bottom-Up
์žฌ๊ท€ ๋ฐ˜๋ณต๋ฌธ
ํฐ๊ฑฐ  โžก ์ž‘์€ ๊ฑฐ ์ž‘์€ ๊ฑฐ โžก ํฐ๊ฑฐ
์ง๊ด€์ / ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ๐Ÿ‘ ๋œ ์ง๊ด€์ (๋ฌธ์ œ ๋”ฐ๋ผ ๋‹ค๋ฆ„)
์‹œ๊ฐ„-๋ฉ”๋ชจ๋ฆฌ save ์—ฌ์ง€ O

 


๋ฐฑ์ค€ ๋ฌธ์ œ ํ’€๋ฉฐ DP ์œ ํ˜• ์ดํ•ด ํ•˜๊ธฐ

DP ์œ ํ˜•์€ ์•„๋ž˜ 3๊ฐ€์ง€๋ฅผ ์ฐพ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜๊ณ , ์ฐพ์€ ํ›„ ํ’€์–ด๋‚˜๊ฐ€์•ผํ•œ๋‹ค.

1. ์ •์˜: f(i) = i๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜. ์ž…๋ ฅ N์— ๋Œ€ํ•ด f(N)์„ ์ถœ๋ ฅํ•œ๋‹ค.
2. ์ดˆ๊ธฐ๊ฐ’: ๐‘–0 = 0, ๐‘–1 = 1
3. ์ ํ™”์‹: f(i) = f(i-2) + f(i-1)

 

 

# ๋ฐฑ์ค€ 2748 ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜

f(i) = i๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜. ์ž…๋ ฅ N์— ๋Œ€ํ•ด f(N)์„ ์ถœ๋ ฅํ•œ๋‹ค.
์ดˆ๊ธฐ๊ฐ’: ๐‘–0 = 0, ๐‘–1 = 1
์ ํ™”์‹: f(i) = f(i-2) + f(i-1)

import sys

n = int(input())

cache = [0] * (n+1)

cache[0] = 0
cache[1] = 1

for i in range(2, n+1):
	cache[i] = cache[i-1] +cache[i-2]
    
print(cache[n])

 

 

# ๋ฐฑ์ค€ 11051 ์ดํ•ญ ๊ณ„์ˆ˜

์ดํ•ญ๊ณ„์ˆ˜ ๊ทœ์น™

f(i) =  iCk
์ดˆ๊ธฐ๊ฐ’: f(0,0) = 1, f(1,0)= 1, f(1,1) = 1 & i==k ์ด๋ฉด 1
์ ํ™”์‹: f(i,k) = f(i-1, k-1) + f(i-1,k)

N, K = map(int, input().split())
cache=[]

for i in range(N+1):
	cache.append([1]*(i+1))
    
for i in range(2, N+1):
	for j in range(1,i):
    	cache[i][j] = (cache[i-1][j-1] +cache[i-1][j])%10007
        
print(cache[N][K])

 

 

# ๋ฐฑ์ค€ 11726 2xN ํƒ€์ผ๋ง

f(i) =  2*i
์ดˆ๊ธฐ๊ฐ’: f(1) = 1, f(2) = 2
์ ํ™”์‹: f(i) = f (i-1) +f(i-2)

import sys
sys.setrecursionlimit(10**6) 

n = int(input()) # n<=1000

cache =[0]*(n+1)
cache[1] =1
cache[2] =2

def f(n):
    if n<3:
        return cache[n]
    if cache[n] != 0:
        return cache[n]%10007
    else:
        cache[n] = f(n-1)+f(n-2)
        return cache[n]%10007
        

print(f(n))
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€