DP(Dynamic Programming)
๋?
๋ณต์กํ ๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฌธ์ ๋ก ๋๋์ด ํธ๋ ์๊ดด์ฆ ์ค๊ณ ๊ธฐ๋ฒ ์. ์ฃผ๋ก ์ค๋ณต๋๋ ํ์ ๋ฌธ์ (Subproblems) ๊ฐ ์๊ณ , ์ด๋ค์ ํ ๋ฒ๋ง ๊ณ์ฐํ๊ณ ๊ทธ ๊ฐ์ ์ฌ์ฌ์ฉ ํ ์ ์์ ๋ ๋งค์ฐ ํจ์จ์ ์ผ๋ก ์๋ํจ.
1. DP ์ ํต์ฌ ๊ฐ๋
์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ (Overlapping Subproblems)
ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ ์์ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด์ ํธ๋ ๊ฒฝ์ฐ
์์ : ํผ๋ณด๋์น ์์ด -
f(n) = f(n-1) + f(n-2)
์ด๊ณ ,f(n-1)
๊ณผf(n-2)
๋ฅผ ๊ตฌํ ๋ ๋ ๊ทธ ํ์ ๋ฌธ์ ๋ค์ด ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถ๋จ.
์ต์ ๋ถ๋ถ ๊ตฌ์กฐ (Optimal Substructure)
๋ฌธ์ ์ ์ต์ ํด๊ฐ ๊ทธ ํ์ ๋ฌธ์ ๋ค์ ์ต์ ํด๋ฅผ ์ด์ฉํด ๊ตฌํ ์ ์์ ๋
์ฆ, ํ์ ๋ฌธ์ ๋ค์ ๋ต์ ํฉ์ณ์ ์ ์ฒด ๋ฌธ์ ์ ๋ต์ ๊ตฌํ ์ ์์.
2. DP ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฐฉ์ 1 : Top-Down(์ฌ๊ท + ๋ฉ๋ชจ์ด์ ์ด์
)
ํฐ ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ์ฌ๊ท์ ์ผ๋ก ์์ ๋ฌธ์ ๋ค์ ํ์ด๊ฐ.
์ด๋ฏธ ํผ ๋ฌธ์ ๋ ๋ฉ๋ชจ๋ฆฌ(๋ฐฐ์ด, ๋์ ๋๋ฆฌ ๋ฑ) ์ ์ ์ฅํด์ ๋ค์ ๊ณ์ฐํ์ง ์์
Java ์์:
Map<Integer, Integer> memo = new HashMap<>();
int fib(int n) {
if(n <= 1) return n;
if(memo.containsKey(n)) return memo.get(n);
int result = fib(n-1) + fib(n-2);
memo.put(n, result);
return result;
}
๋ฐฉ์ 2 : Bottom-Up (๋ฐ๋ณต๋ฌธ + ํ
์ด๋ธ)
์์ ๋ฌธ์ ๋ถํฐ ์ฐจ๋ก๋๋ก ํ์ด์ ๋ต์ ๊ตฌํจ.
๋ณ๋์ ์ฌ๊ท ํธ์ถ์ด ์๊ณ , ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํ๋จ.
Java ์์:
int fib(int n) {
if(n <= 1) return n;
int[] db = new int[n+1];
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
3. ์์ฃผ ๋์ค๋ DP ๋ฌธ์ ์ ํ
1์ฐจ์ DP
ํผ๋ณด๋์น, ๊ณ๋จ ์ค๋ฅด๊ธฐ
dp[i] = dp[i-1] + dp[i-2]
2์ฐจ์ DP
LCS(Longest Common Subsequence), LCS
dp[i][j]
๋ฅผ ์๋ฏธ์ ์ผ๋ก ์ ์
๋ฐฐ๋ญ ๋ฌธ์
0/1 Knapsack
dp[i][w] = max(dp[i-1][w], dp[i-1][w-weight]+value)
๊ตฌ๊ฐ DP
ํฐ๋ฆฐ๋๋กฌ ๋ถํ , ํ๋ ฌ ๊ณฑ ์ต์ ํ
๊ตฌ๊ฐ dp[l][r]
์ ๋ํ ์ ํ์
์ํ ์์ถ DP
์ฌํ์ ๋ฌธ์ , ์ธํ์ ์ํ
๋นํธ ๋ง์คํฌ ํ์ฉ
DP + DFS
๊ฒ์ํ ํ์, ๊ฒฝ๋ก ํ์
DFS ๋ด์์ dp[x][y]
์ ์ฅ
DP + ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
์ต๋ ๋ถ๋ถํฉ
๋ฉ๋ชจ๋ฆฌ ์ต์ ํ
4. DP ๋ฌธ์ ํ์ด ์์
๋ฌธ์ ๋ฅผ ๋ณด๊ณ ์ค๋ณต๋๋ ๊ณ์ฐ์ด ์๋์ง ํ์
๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฌธ์ ๋ค๋ก ๋๋ ์ ์๋์ง ํ๋จ.
dp ๋ฐฐ์ด(ํน์ ๋ฉ๋ชจ ํ ์ด๋ธ)์ ์ ์์ ์๋ฏธ ๋ถ์ฌ
์ ํ์(์ด์ ์ํ์์ ํ์ฌ ์ํ๋ก ๊ฐ๋ ๋ฐฉ๋ฒ) ๋์ถ
์ด๊ธฐ๊ฐ ์ค์
๋ฐ๋ณต๋ฌธ or ์ฌ๊ท๋ก ๊ตฌํ
๋ฉ๋ชจ๋ฆฌ๋ ์๊ฐ ์ต์ ํ ํ์์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ, ์ํ ์์ถ ๋ฑ ์ ์ฉ
5. ์์ : ๊ณ๋จ ์ค๋ฅด๊ธฐ(ํ ๋ฒ์ 1์นธ ๋๋ 2์นธ ์ค๋ฅผ ์ ์์)
๋ชฉํ :
n
์นธ ๊ณ๋จ์ ์ค๋ฅด๋ ๋ฐฉ๋ฒ์ ์์ ํ์ :
dp[i] = dp[i - 1] + dp[i - 2]
์ด๊ธฐ๊ฐ :
dp[0] = 1
,dp[1] = 1
int climbStairs(int n) {
if(n <= 1) return 1;
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
Last updated
Was this helpful?