Dynamic Programming
ํฐ ๋ฌธ์ ๋ฅผ ๋๋์ด ์์ ๋ฌธ์ ๋ก ํธ๋ ๊ฒ
ํ๋์ ๋ฌธ์ ๋ ๋จ ํ ๋ฒ์ ํ์ด๋ง ํ๋ค.
Dynamic Programming ๊ณผ Recursion(์ฌ๊ท)์ ์ฐจ์ด์
DP์ ์ฌ๊ท๋ ์ผํ๋ณด๋ฉด '๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ์ผ์ด๋๋ ์ ' ์์ ๋น์ทํ๋ค๊ณ ์๊ฐํ ์ ์๋ค.
ํ์ง๋ง, ํฐ ์ฐจ์ด์ ์ ์ผ๋ฐ์ ์ธ ์ฌ๊ท๋ฅผ ๋จ์ํ ์ฌ์ฉํ๋ฉด ๋์ผํ ์์ ๋ฌธ์ ๋ค์ด ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต ๋์ด ๋นํจ์จ์ ์ธ ๊ณ์ฐ๋ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๊ฐ์ฅ ๋ํ์ ์ธ ์์๋ ํผ๋ณด๋์น ํจ์์ด๋ค.
DP ์กฐ๊ฑด
๋ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
1. ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์
2. ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ
๋์ผํ ์์ ๋ฌธ์ ๋ค์ด ๋ฐ๋ณต์ ์ผ๋ก ์ผ์ด๋ ๋, ๊ฐ์ ๋ฌธ์ ๋ ํญ์ ์ ๋ต๋ ๊ฐ๋ค. ์ฆ, ์ค๋ณต ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
DP ๋ฌธ์ ํ์ด ๋ฐฉ๋ฒ
๋ชจ๋ ์์ ๋ฌธ์ ๋ ํ ๋ฒ๋ง ํ์ด์ผ ํ๋ค.
์ดํ ํฐ ๋ฌธ์ ๋ฅผ ํ ๋ ๋๊ฐ์ ์์ ๋ฌธ์ ๊ฐ ์ผ์ด๋๋ฉด ์์ ํ์๋ ๊ฒ์ ์ด์ฉํ์ฌ ํผ๋ค.
dp[0], dp[1], dp[2], dp[3] ์ด๋ ๊ฒ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค ๋ณด๋ฉด ๊ท์น์ ๋ฐ๊ฒฌํ๊ฒ ๋๋ค.
๋๋ฌธ์ dp[4]๋ฅผ ํด๊ฒฐํ ๋ ์ฆ์์๋ ์ด์ ์ ๊ตฌํด๋์ ์์ ๋ฌธ์ ๋ค์ธ dp[0],dp[1],dp[2],dp[3]์ ์ด์ฉํด ์ ํ์์ ๋์ถํ ์ ์๋ค.
[1] DP๋ก ํ ์ ์๋ ๋ฌธ์ ์ธ์ง ํ์ธ
[2] ๋ฌธ์ ์ ๋ณ์ ํ์
[3] ๋ณ์ ๊ฐ ๊ด๊ณ์ ๋ง๋ค๊ธฐ (์ ํ์)
[4] ๋ฉ๋ชจํ๊ธฐ memoization
[5] ๊ธฐ์ ์ํ ํ์ ํ๊ธฐ
[6] ๊ตฌํํ๊ธฐ
DP ๊ตฌํ ๋ฐฉ๋ฒ
DP๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์๋ค.
1. Bottom-Up : ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ
์๋์์๋ถํฐ ๊ณ์ฐ์ ์ํํ๊ณ ๋์ ์์ผ ์ ์ฒด์ ์ธ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์์์ ์ ๊น ์ค๋ช ํ๋ ๊ฒ์ฒ๋ผ dp[0]๋ถํฐ dp[n-1]๊น์ง์ ๊ฐ์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํด์ ์ ํ์์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ค.
2. Top-Down : ์ฌ๊ท ์ฌ์ฉ
์์์๋ถํฐ ํธ์ถ์ ์์ํด dp[0]๊น์ง ๋ด๋ ค๊ฐ ๊ฒฐ๊ณผ ๊ฐ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๋ค. ํผ๋ณด๋์น ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ๋ํ์ ์ด๋ค.
f(n) = f(n-1) + f(n-2) ์ ์๊ณผ ๊ฐ์ด ๋์ผํ ๊ณ์ฐ์ด ๋ฐ๋ณต์ ์ผ๋ก ๋์ค๋ฉด์ ์์์๋ถํฐ ํธ์ถ์ ํ๋ค.
DP์ ์ฅ์
๋์ ๊ณํ๋ฒ์ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ฉด ๋งค์ฐ ๋น ๋ฅด๊ฒ ํด๋ฅผ ์ป์ ์ ์๋ค.
์ง์ ๋ณต์ก๋ ์๊ณ ๋ฆฌ์ฆ์ ๋คํญ ์๊ฐ์ผ๋ก ์ค์ฌ์ฃผ๊ธฐ๋ ํ๊ณ , ๊ฐ์ ๋คํญ ์๊ฐ ์๊ณ ๋ฆฌ์ฆ๋ ์ฐจ์๋ฅผ ๋ฎ์ถ ์ ์๋ค.
DP ์์
ํผ๋ณด๋์น ์์ด์ ๋ค์๊ณผ ๊ฐ์ ์ฌ๊ท์ ํํ๋ฅผ ๊ฐ์ง๋ค.
f(0) = 1
f(1) = 1
f(n) = f(n-1) + f(n-2) when n > 1
Dynamic Programming์ ์ด์ฉํ์ฌ, ํผ๋ณด๋์น ์์ด์ ๋ํ๋ด์ด๋ผ
Python์ผ๋ก ํ๊ธฐ
memo = [0 for i in range(100)] #๋ฉ๋ชจ์ด์ ์ด์
๊ณต๊ฐ. ์ ์ญ ๋ณ์์ด๋ฏ๋ก 0์ผ๋ก ์ด๊ธฐํ
memo[0] = 0
memo[1] = 1
def fibonacci(n) :
if memo[n]!=0 :#๋ฉ๋ชจ๊ฐ ์๋์ง ํ์ธ(0์ผ๋ก ์ด๊ธฐํ๋์์ผ๋ฏ๋ก 0์ด ์๋๋ผ๋ฉด ๋ฉ๋ชจ๊ฐ ์ฐ์ธ ๊ฒ์)
return memo[n] #๋ฉ๋ชจ ๋ฆฌํด
memo[n]=fibonacci(n-1) + fibonacci(n-2) #์์ ๋ฌธ์ ๋ก ๋ถํ
return memo[n]