๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ ์ ํ์๊ณผ memoization ์ด๋ค.
DP๋ ์ฃผ๋ก bottom-up ๋ฐฉ์์ ์ฌ์ฉํ์ง๋ง, top-down์ผ๋ก๋ ๊ตฌํ ๊ฐ๋ฅํ๋ค.
top-down์ ์ฌ๊ท+memoization์ ํตํด ๊ตฌํํ๋ค.
๋ํ์ ์ธ DP๋ฌธ์ ๋ก, ํผ๋ณด๋์น ์์ด์ด ์๋ค.
https://www.acmicpc.net/problem/2748
๐ ํผ๋ณด๋์น ์์ ์ ํ์์ f(n) = f(n-1) + f(n-2) (n>=2)
๐ Bottom-Up
์ ํ์์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํ์ฌ ์ ์ผ ์์ ๊ฐ๋ถํฐ ๊ตฌํ๊ณ ์ ํ๋ ๊ฐ๊น์ง ๋ฐ๋ณตํ๋ค.
์ ํผ๋ณด๋์น ๋ฌธ์ ๋ฅผ ์๋ก๋ค์ด, f(10)๊น์ง ๊ตฌํ๊ธฐ ์ํด์๋ f(2)๋ถํฐ ๋ฐ๋ณต์ ์์ํ๋ค.
์ฝ๋๋ก ์์ฑํ๋ฉด,
n = 10
f = [0] * (n+1)
f[0] = 0
f[1] = 1
for i in range(2, n+1):
f[i] = f[i-1]+f[i-2]
print(f[n])
์ ํ์์ ๋ฒ์์ ์ฃผ์ํ์ฌ ๋ฐ๋ณต๋ฌธ์ ์์ฑํ๋ฉด ๋๋ค.
๐ Top-Down
์ฌ๊ท์ ๋ฉ๋ชจ์ ์ด์ ์ ์ด์ฉํ๋ค. (๋จ์ํ ์ฌ๊ท๋ง ์ด์ฉํ๋ฉด ์๊ฐ์ด๊ณผ ๋ ๊ฐ๋ฅ์ฑ โฌ๏ธ)
์ฌ๊ทํจ์๋ ๊ตฌํ๊ณ ์ํ๋ f(10)์ ๋ฃ์ด, ๋ต์ด ๋์ฌ๋๊ฐ์ง ์ฌ๊ทํจ์๋ฅผ ํธ์ถํ๋ค.
์ฝ๋๋ก ์์ฑํ๋ฉด,
n = 10
memo = [0] * (n+1)
memo[0] = 0
memo[1] = 1
def f(n):
if n == 0:
return 0
if n == 1:
return 1
if memo[n] == 0:
memo[n] = f(n-1) + f(n-2)
return memo[n]
print(f(n))
ํ์ง๋ง, ์ฌ๊ทํจ์๋ ์คํ์ ๊ฐ์ด ๊ณ์ ์์ฌ ์ค๋ฒํ๋ก์ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋งํ๋ฉด DP๋ bttom-up ํ๋ ๊ฑธ๋ก..!
๐ก ์ค์ํ ๊ฒ์ ๊ท์น์ ์ฐพ์ ์ ํ์์ ๋ง๋ค์ด ๋ด๋ ๊ฒ
๐ ๋ฐฑ์ค 11726๋ฒ
https://www.acmicpc.net/problem/11726
์ ํ์์ ๋ค์๊ณผ ๊ฐ๋ค.
f(3)๋ถํฐ ๊ท์น์ด ๋ฐ๊ฒฌ๋๋๋ฐ, f(2)์ ํ๋์ ํ์ผ ํ๋๋ฅผ ๋ถ์ด๋ ๋ฐฉ๋ฒ + f(1)์ ํํฌ์ ํ์ผ ํ ์์ ๋ถ์ด๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์ฆ, f(n) = f(n-1)์ ํ๋์ ํ์ผ์ ํ๋ ๋ถ์ด๊ธฐ + f(n-2)์ ํํฌ์ ํ์ผ ํ ์์ ๋ถ์ด๊ธฐ (n>=2)
์ฝ๋๋ก ์์ฑํ๋ฉด,
f(0) = 1์ ํด์ค ์ด์ ๋, f(2) = f(1) + f(0) = 2๊ฐ ๋์ค๊ฒ ํ๊ธฐ ์ํจ์ด๋ค.
import sys
n = int(sys.stdin.readline())
dp = [0] * (n+1)
dp[0] = 1
dp[1] = 1
for i in range(2, n+1):
dp[i] += (dp[i-1] + dp[i-2])%10007
print(dp[n])
'๐ Algorithm > Tip' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ์ต์ํ(MIN heap) / ์ต๋ํ(MAX heap) (0) | 2022.01.31 |
---|---|
[Algorithm] LCA ์๊ณ ๋ฆฌ์ฆ (0) | 2021.03.28 |
[Algorithm] Dijkstra ๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ (0) | 2021.03.11 |
[Algorithm] ๋๋น ์ฐ์ ํ์ BFS / ๊น์ด ์ฐ์ ํ์ DFS (0) | 2020.08.24 |