๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ์ผ๋ก ๋๋๋ ๊ฒ์ด ํต์ฌ์ด์๋ค. ์ ํํ๋ ๋ถํ ํ ์ ์์ ๋๊น์ง ๋ถํ ํ์ฌ ๊ฐ๋จํ ๋ฌธ์ ๋ถํฐ ์ ๊ทผํ์๋ค. ๊ต์ฅํ ์์ฃผ ์ฌ์ฉํ๋ฉฐ, ์ข์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํ์ง๋ง, ๋ถํ ํ๋ฉฐ ์๊ธฐ๋ ๋ถ๋ถ ๋ฌธ์ ๋ค์ด ์ค๋ณต๋์ด๋ ๋ค์ ์ฌ์ฉํ์ง ์๋๋ค.
์ด๋ฏธ ๊ตฌํ ๋ฌธ์ ๋ฅผ ๋ ํธ๋ ๊ฒ์ ์ง๋ฃจํ๊ณ ์๊ฐ์ด ๋๋ ์ผ์ด๋ค. ์ ํ๋ง๋ค ๋ค๋ฅด๊ฒ ์ง๋ง, ๋ถํ ์ ๋ณต๋ ๋ง์ฐฌ๊ฐ์ง์ผ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ค๋ณต๋ ๋ฌธ์ ๋ฅผ ๊ตณ์ด ๋ค์ ํ์ง ์๋ ํ ํฌ๋์ด ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก "DP ์๊ณ ๋ฆฌ์ฆ", Dynamic Programming ์ธ ๊ฒ์ด๋ค.
DP ์๊ณ ๋ฆฌ์ฆ์ ๋ฏธ๋ฆฌ ์ต์ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ํด๋ฅผ ๊ตฌํ๋ค. ์ด๋ ๋ ผ๋ฆฌ์ ์ผ๋ก ์๊ฐํ์ ๋ ๋งค์ฐ ๋น์ฐํ๋ค๊ณ ์ฌ๊ฒจ์ง๋ ๊ฒ๋ค์ด๋ค. ๋ํ ์ด ํด๋ฅผ ์ด์ฉํ์ฌ ์ต์ ๋ถ๋ถ ๋ฌธ์ ๋ณด๋ค ๋ ํฐ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ํ์ด์ผ ํ๋ค.
์ฆ, ๋ถ๋ถ ๋ฌธ์ ์ ๋ถ๋ถ ๋ฌธ์ ์ฌ์ด์ ์ด๋ค ๊ด๊ณ๊ฐ ์ ์๋์ด ์๋ค๋ ๊ฒ์ ์ ์ถํ ์ ์๋ค. ์ด ๊ด๊ณ๋ ๋ฌธ์ ๋ ์ ๋ ฅ์ ๋ฐ๋ผ ๋ค๋ฅด๊ณ , ๋๋ถ๋ถ์ ๋๋ ท์ด ๋ณด์ด์ง ์์ "ํจ์ถ์ ์์"๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๊ทธ๋์ ๊ทธ๋ฐ์ง ๋๋ฝ๊ฒ ์ด๋ ต๊ธฐ๋ ํ๋ค.
๋ถํ ์ ๋ณต vs. DP ์๊ณ ๋ฆฌ์ฆ
์๋ ์ฝ๋๋ฅผ ํตํด ์ด๋ค ์ฐจ์ด์ ์ด ์๋ ์ง ๋จผ์ ํ์ธํด ๋ณด์.
๋๋ฆฌ ์๋ ค์ ธ ์๋ ๋ง๋ ์๋ฅด๊ธฐ ๋ฌธ์ ๋ฅผ ์ ์ฉ์์ผฐ๋ค.
๋ถํ ์ ๋ณต ์์ด๋์ด
cutRod_DC(p[], i)
// ๊ธธ์ด i์ ๋ง๋๋ฅผ ํ๋งคํ ๋ ์ป์ ์ ์๋ ์ต๋ ํ๋งค ๊ธ์ก, R(i)๋ฅผ ๊ณ์ฐํ๋ค.
// ์ ๋ ฅ : p[1 ... n] - ๋ง๋๋ค์ ํ๋งค ๊ฐ๊ฒฉ
// i - ๋ง๋์ ๊ธธ์ด
// ์ถ๋ ฅ(๋ฐํ๊ฐ) : ์ต๋ ํ๋งค ๊ธ์ก
if (i == 0) return 0
else {
maxSell = 0
for(j=1; j<=i; j++) {
maxSell = MAX(maxSell, p[j] + cutRod_DC(p, i-j))
return maxSell
}
}
// ์ต์ด ํธ์ถ
maxSellValue = cutRod_DC(p, n)
์ ์ผ ์ค์ํ ์ Max(maxSell, p[j] + cutRod_DC(p, i-j)๋ฅผ R(n)์ด๋ผ๊ณ ํด๋ณด์. ์ด R(n)์ ๊ธธ์ด๊ฐ n์ธ ๋ง๋๋ฅผ ํ๋งคํ์ ๋, ์ป์ ์ ์๋ ์ต๋์ ๊ธ์ก์ ์๋ฏธํ๋ค.
p[j]๋ผ๋ ๋ง๋์ ๊ธธ์ด์ ๋ง๋ ๊ฐ๊ฒฉ์ผ๋ก ํ๋งคํ ํ, ๋จ์ ๊ธธ์ด์ ๋ํด ์ฌ๊ท์ ์ผ๋ก cutRod_DC(p, ๋จ์ ๊ธธ์ด)๋ฅผ ํธ์ถํ๋๋ฐ, ์์ธํ ์ดํด๋ณด๋ฉด j ์์ฒด๊ฐ 1~i๊น์ง ๋ชจ๋ ์ผ์ด์ค๋ฅผ ํ์ธํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋์ ์๊ฐ ๋ณต์ก๋๋ ์ง์์๊ฐ์ผ๋ก ๋งค์ฐ ๊ธธ๋ค. ๊ทธ ํ์ด๋ ์๋์ ๊ฐ๋ค.
์1 : T(n) = 1 + (T(n-1) + T(n-2) + ... + T(1) + T(0)), n>=1
์2 : T(n-1) = 1 + (T(n-2) + T(n-3) + ... + T(1) + T(0))
์1 - ์2 = T(n) - T(n-1) = T(n-1)
T(n) = 2 * T(n-1) = 2 * (2*T(n-2)) = 2^2(2*T(n-2))
= 2^n * T(0) = 2^n
DP ์์ด๋์ด
cutRod_DP(p[], n)
// ๊ธธ์ด n์ ๋ง๋๋ฅผ ํ๋งคํ ๋, ์ป์ ์ ์๋ ์ต๋ ํ๋งค ๊ธ์ก์ ๊ณ์ฐ
// ์ ๋ ฅ : p[1...n] - ๋ง๋๋ค์ ํ๋งค ๊ธ์ก, n : ๋ง๋์ ๊ธธ์ด
// ์ถ๋ ฅ(๋ฐํ๊ฐ) : ์ต๋ ํ๋งค ๊ธ์ก
๋ฐฐ์ด maxSell[0...n] ์ ์ธ
maxSell[0] = 0
for(j = 1; j<=n; j++) {
maxVal = 0
for(k = 1; k<=j; k++) {
maxVal = MAX(maxVal, p[k] + maxSell[j - k])
maxSell[j] = maxVal
}
}
return maxSell[n]
์ฌ๊ธฐ์ ์ฐจ์ด์ ์ด ๋ ๋งํ ๋ถ๋ถ์ MAX(...) ๋ถ๋ถ์ด๋ค. ํด๋น ๋ถ๋ถ์์ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํ๋ ๋ถํ ์ ๋ณต๊ณผ ๋ฌ๋ฆฌ ๊ทธ๋ฅ maxSell[j-k]๋ฅผ ํธ์ถํ๊ณ ์๋ค. ๋์ ์ด๊ธฐ์ maxSell์ ๋ํ ๋ฐฐ์ด ์ ์ธ์ ์ฐ์ ์ ์ผ๋ก ํด์ผ ํ๋ค.
์ด๋ ๊ฒ DP ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ง๋ ๊ธธ์ด ๊ตฌํ๊ธฐ ๋ฌธ์ ๋ฅผ ํ๋ฉด ์๊ฐ๋ณต์ก๋๋ O(n^2)์ด ๋์จ๋ค.
๋ชจ๋ ์ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์
์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ต์คํธ๋ผ๋ ํ๋ก์ด๋ ์์ต ๋ฑ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค. ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ์๊ฒ ์ง๋ง์, ๊ฐ๋จํจ์ผ๋ก ๋ฐ์ง๋ฉด ํ๋ก์ด๋ ์์ต์ด ๊ฐ์ฅ ์ข๋ค. ์ต๋จ ๊ฒฝ๋ก์ ๋ํด ๊ถ๊ธํ๋ค๋ฉด ์๋ ๋งํฌ์์ ํ์ธํ์.
[์๊ณ ๋ฆฌ์ฆ] ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ - Dijkstra, Bellman-Ford, Floyd-Warshall ์๊ณ ๋ฆฌ์ฆ
Dijkstra ์๊ณ ๋ฆฌ์ฆ ์ต๋จ ๊ฒฝ๋ก(Shortest Path) ์ฐพ๊ธฐ๋ ์ฃผ์ด์ง ๊ฐ์ค์น ๊ทธ๋ํ์์ ์ถ๋ฐ์ ์์ ๋์ฐฉ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ด ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ ์ค ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก D
devrepo.tistory.com
์์ ๋งํ๋ฏ์ด DP ๋ฌธ์ ๋ ๋ถ๋ถ ๋ฌธ์ ๋ค์ "ํจ์ถ์ ์์"์ ๊ด๊ณ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค๊ณ ํ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด ๋ฌธ์ ์์ ๋ณด์ด์ง ์๋ ๋ถ๋ถ ๋ฌธ์ ๋ค๊ฐ์ ๊ด๊ณ๋ ๋ฌด์์ผ๊น?
์ด๋ฅผ ํ์ ํ๊ธฐ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ ์ด๋ป๊ฒ ์ ์ํด์ผ ํ๋ ์ง๋ถํฐ ์์์ผ ํ๋ค. ํต์ฌ์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ผ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ํด ํน์ ์์น์์ ๋ค๋ฅธ ์์น๊น์ง ์ด๋ํ๋๋ฐ, ์ง์ ๊ฐ๋ ๊ฒ๊ณผ ์ด๋๊ฐ๋ฅผ ๊ฒฝ์ ํด์ ๊ฐ๋ ๊ฒ ์ค ์งง์ ๊ฒ์ ํํด์ผ ํ๋ค. ์ฆ, ๋ถ๋ถ ๋ฌธ์ ๋ "๊ฒฝ์ ํด์ ๊ฐ๋ ๊ฒ๊ณผ ์ง์ ๊ฐ๋ ๊ฒ ์ค ์งง์ ๊ฒ์ ํ"ํ๋ ๊ฒ์ผ๋ก ์ ์ํ ์ ์๋ค.
์ ์๋ ๋ถ๋ถ ๋ฌธ์ ์ ๋ฐ๋ผ์ DP ๋ฐฐ์ด์ ๋ง๋ ๋ค๋ฉด ์๋์ ๊ฐ์ด ๋ง๋ค ์ ์๋ค.
DP = ์ {1, ... , k } ๋ฅผ ๊ฒฝ์ ๊ฐ๋ฅํ ์ ์ผ๋ก ๊ณ ๋ คํ์ฌ, ์ i์์ j๊น์ง์ ๋ชจ๋ ๊ฒฝ๋ก ์ค ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก์ ๊ฑฐ๋ฆฌ
์ฌ๊ธฐ์ k๋ฅผ ๊ฒฝ์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋ ๊ฒ์ด ์๋๋ผ๋ฉด ์ฐ์ง ์๋๋ค.
๐ฒ ๊ฐ์ฅ ์์ ๋ถ๋ถ ๋ฌธ์
$D_{ij}^{1}$์ ๋ชจ๋ ์ i์ j์ ๋ํด ๊ฐ์ฅ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ๊ณ์ฐํ๋ค.
๐ฒ $D_{ij}^{2}$ ์ ๊ฒฝ์ฐ
์ i์์ ์ 2๋ฅผ ๊ฒฝ์ ํ์ฌ j๋ก ๊ฐ๋ ๊ฒฝ์ฐ์ i์์ j๋ก ๋ฐ๋ก ๊ฐ๋ ๊ฒฝ์ฐ ์ค ์ต์๊ฐ์ ์ ํํ๋ค. ๊ฒฝ์ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด $D_{i2}^{1}+D_{2j}^{1}$๊ฐ ๋๋ค.
$D_{i2}^{1}$ ๋ฅผ ๊ณ์ฐํ๋ ๊ณผ์ ์์ ์ด์ ์ ํ์๋ ๋ถ๋ถ ๋ฌธ์ ํด๋ฅผ ์ฌ์ฉํ๋ค.
๐ฒ $D_{ij}^{k}$ ์ ๊ฒฝ์ฐ
i์์ k๋ฅผ ๊ฒฝ์ ํ์ฌ j๋ก ๊ฐ๋ ๊ฒฝ์ฐ์ ๋ฐ๋ก i์์ j๋ก ๊ฐ๋ ๊ฒฝ์ฐ ์ค ์ต์ ๊ฐ์ ์ฐพ๋๋ค.
๋ชจ๋ ์ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ์ ์๋ ์ฝ๋
์์ ์์๋ณธ ๊ฐ๋ ์ ๋ฐ๋ฅด๋ฉด ์ฝ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
for k = 1 to n
for i = 1 to n(i != k)
for j = 1 to n(j != k, j!=i)
D[i, j] = min{ D[i, k] + D[k, j], D[i, j] }

ํ์ฌ ๋ ธ๋ ๊ฐ์ ๊ฐ์ค์น๋ฅผ ๋ํ๋ธ ํ๋ ฌ์ด๋ค.(์์ ๊ฐ์ค์น ํฌํจ)
์ผ์ชฝ ๋ฐฐ์ด์ ๋ณด๊ณ ์ค๋ฅธ์ชฝ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋ ๊ณผ์ ์ ์ง์ ํด๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค.
์ฐ์ ํ๋ ฌ ๊ณฑ์
์ฐ์ ํ๋ ฌ ๊ณฑ์ ์ ์ฐ์๋ ํ๋ ฌ ๊ฐ์ ๊ณฑ์ ์ ์ต์ ํ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ๋ฌธ์ ๋ฅผ ํ๋ ค๋ฉด ํ๋ ฌ์ ๊ณฑ์ ๋ฒ์น์ ๋ํด์ ์ ํ ํ์ต์ด ๋์ด์ผ ํ๋ค. ์ผ๋จ ๋ ์ ํ์๋ค.
ํ๋ ฌ ๊ณฑ์ ์ ๊ฒฐํฉ ๋ฒ์น์ด ์ ์ฉ๋๋ค. A x B x C = (A x B) x C = A x (B x C) ๋ผ๋๊ฒ ์ ์ฉ๋๋ค๋ ๋ง์ด๋ค.
๋ํ ํ๋ ฌ ๊ณฑ์ ์ ์ํด์๋ ์์ ์์๋ ์ด, ๋ค์ ์์๋ ํ์ด ์ผ์นํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด (10 x 5 ํ๋ ฌ) * (5 x 15 ํ๋ ฌ)์ด์ด์ผ ๊ณฑ์ ์ด ์ฑ๋ฆฝํ๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๋ ํด๋น ๊ณฑ์ ์ ๊ฒฐ๊ณผ๋ก๋ ์์ ์์์์ ํ๊ณผ ๋ค์ ์์์์ ์ด์ ๊ฐ์ ธ์ค๋ฉด ๋๊ธฐ ๋๋ฌธ์ 10 x 15๊ฐ ๊ทธ ๊ฒฐ๊ณผ์ด๋ค.
์์ ๋งํ๋ฏ์ด ํ๋ ฌ ๊ณฑ์ ์ ๊ฒฐํฉ ๋ฒ์น์ด ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ฐ์ฐ์ ๋จผ์ ํ๋๋์ ๋ฐ๋ผ ๊ทธ ํ์๊ฐ ๋ฌ๋ผ์ง๋ค. ์ฆ, A x B๋ฅผ ๋จผ์ ํ๋, B x C๋ฅผ ๋จผ์ ํ๋๊ฐ ๊ณฑ์ ํ์์ ์ค์ํ ์์ธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ถ๋ถ๋ฌธ์ ๋ ์ด๋ป๊ฒ ์ ์ํ ์ ์์๊น? ์ด๋ (A), (AxB), (AxBxC)์ ๊ฐ์ด ์ฐ์๋ ํ๋ ฌ๊ณฑ์ ์กฐํฉ์ผ๋ก ๋๋ฉด๋๋ฉฐ ์ด ํฌ๊ธฐ๋ง ์ ์กฐ์ ํ๋ฉด ๋๋ค.
์ฐ์ ํ๋ ฌ ๊ณฑ์ ์ ์๋ ์ฝ๋
์ ๋ ฅ : ์ฐ์๋ ํ๋ ฌ A1 x A2 x A3 ... An, ๋จ A1์ d0 x d1, A2๋ d1 x d2, ... An์ dn-1 x dn์ด๋ค.
์ถ๋ ฅ : ์ ๋ ฅ์ ํ๋ ฌ ๊ณฑ์ ์ ํ์ํ ์์์ ์ต์ ๊ณฑ์ ํ์
for i = 1 to n
C[i, i] = 0
for L = 1 to n-1
for i = 1 to n-L
j = i + L
C[i, j] = ๋ฌดํ๋
for k=i to j-1
$temp=[ \left[ i,k\right] +[ \left[ k+1,j\right] +d_{i-1}d_{k}d_{j}$
if (temp < C[i, j])
C[i, j] = temp
return C[1, n]
๐ฒ ์ ๋ ฅ์ ๋ณด๊ณ A1 ~ An๊น์ง๊ฐ ํ๋ ฌ ๊ณฑ์ด๋ผ๋ ๊ฒ๋ถํฐ ํ์ ํ๋ค.
๐ฒ C๋ ๋ชจ๋ ๋ถ๋ถ ๋ฌธ์ ๋ค๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ด๋ค.(DP ๋ฐฐ์ด)
๐ฒ L์ ๋ถ๋ถ ๋ฌธ์ ์ ์ฌ์ด์ฆ๋ฅผ ์กฐ์ ํ๋ค. ํน์ดํ ์ ์ L์ด 1์ผ๋, ๋ถ๋ถ ๋ฌธ์ ์ ํฌ๊ธฐ๋ 2, L์ด 2์ผ ๋ ๋ถ๋ถ ๋ฌธ์ ์ ํฌ๊ธฐ๋ 3... n-1์ผ๋๋ ๋ถ๋ถ ๋ฌธ์ ์ ํฌ๊ธฐ๊ฐ n์ด๋ค. (L์ด 1์ด๋ฉด ๋ถ๋ถ ๋ฌธ์ ๋ A1 x A2์ ๊ฐ์ด ๋๋ค.)
๐ฒ i๋ ๋ถ๋ถ ๋ฌธ์ ์ ์์ ์ธ๋ฑ์ค, j๋ ๋ถ๋ถ ๋ฌธ์ ์ ๋ ์ธ๋ฑ์ค๋ฅผ ๋ปํ๋ค. k๋ ๊ทธ ์ฌ์ด์ ๊ฒ๋ค๋ก ์ด๋ฅผ ํตํด ๊ฐ ๊ฒฝ์ฐ์ ๋ถ๋ถ ๋ฌธ์ ์ผ์ด4์ค๋ค์ ์ฒ๋ฆฌํ๋ค.
๐ฒ $temp=[ \left[ i,k\right] +[ \left[ k+1,j\right] +d_{i-1}d_{k}d_{j}$์์ ์์ C๋ฐฐ์ด ๋๊ฐ๋ ๊ณฑํ๊ณ ์ ํ๋ ํ๋ ฌ ๋๊ฐ๋ฅผ ์๋ฏธํ๋ค. ๋ง์ง๋ง $d_{i-1}d_{k}d_{j}$๋ ์ค์ ๋ก ๊ณฑํ์ ๋์ ๊ณฑ์ ํ์์ด๋ค.
ํธ์ง ๊ฑฐ๋ฆฌ ๋ฌธ์ (Edit Distance)
ํธ์ง ๊ฑฐ๋ฆฌ ๋ฌธ์ ๋ ์ฝ์ , ์ญ์ , ๋์ฒด ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด S๋ฅผ ๋ฌธ์์ด T๋ก ๋ณํํ ๋ ํ์ํ ํธ์ง ์ฐ์ฐ ํ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ์์ ๋ ๋ฌธ์ ๋ณด๋ค๋ ์ฌ์ฐ๋ ๋ฐ๋ก ๋ถ๋ถ ๋ฌธ์ ์ ์๋ถํฐ ํด๋ณด์.
E[i, j] = S์ ์ฒ์ i๊ฐ ๋ฌธ์๋ฅผ T์ ์ฒ์ j๊ฐ์ ๋ฌธ์๋ก ๋ฐ๊พธ๋ ๋ฐ ํ์ํ ํธ์ง ๊ฑฐ๋ฆฌ
์๋ฅผ๋ค์ด, 'strong' -> 'stone'์ ๋ํด 'stro' -> 'sto'๋ก ๋ฐ๊พธ๊ธฐ ์ํ ํธ์ง ๊ฑฐ๋ฆฌ๋ E[4, 3]์ด๋ค.
๐ฒ E[4, 3]์ ๊ตฌํ๋ ค๋ฉด?('stro' -> 'sto')
1๏ธโฃ E[4,2] + 1
E[4, 2]๋ฅผ ์๊ณ ์๋ ์ํ์์ E[4, 3]์ ๊ตฌํ๋ ค๋ฉด 'o'๋ฅผ ํ๋ ๋ํด์ผ ํ๋ค. ์ฆ, E[4, 2] + 1 (T๊ฐ ์ฆ๊ฐํ๋ฉด ์ฝ์ ์ฐ์ฐ)
2๏ธโฃ E[3, 3] + 1
E[3, 3]์ ์๊ณ ์๋ ์ํ์์ E[4, 3]์ ๊ตฌํ๋ ค๋ฉด E[4, 3]์์ 'o'๋ฅผ ๋นผ์ผ ํ๋ค.(S๊ฐ ์ฆ๊ฐํ๋ฉด ์ญ์ ์ฐ์ฐ)
3๏ธโฃ E[3, 2] + 0(ํน์ 1์ธ๋ฐ, ์์์ ๊ฒฝ์ฐ 0)
E[3, 2]๋ฅผ ์๊ณ ์๋ ์ํ์์ E[4, 3]์ ๊ตฌํด์ผ ํ๋ค. ์ด๋ S์ T๊ฐ ๋๋ค ์ฆ๊ฐํ์ฌ๋ ๋์ฒด๊ฐ ์์ผ๋ฏ๋ก 0์ ๋ํ๋ค.(๋๋ค 'o')
ํด๋น ์์๋ฅผ ์ผ๋ฐํ ํ๋ฉด ์๋์ ๊ฐ์ ๊ด๊ณ์์ ๋์ถํ ์ ์๋ค.
ํธ์ง ๊ฑฐ๋ฆฌ ๋ฌธ์ (Edit Distance)์ ์๋ ์ฝ๋
EditDistance
์ ๋ ฅ : ์คํธ๋ง S, T, ๋จ, S์ T์ ๊ธธ์ด๋ ๊ฐ๊ฐ m๊ณผ n์ด๋ค.
์ถ๋ ฅ : S๋ฅผ T๋ก ๋ณํํ๋ ํธ์ง ๊ฑฐ๋ฆฌ, E[m, n]
// ํ๊ณผ ์ด ์ด๊ธฐํ
for i = 0 to m E[i, o] = i;
for j = 0 to n E[0, j] = j;
for i = 1 to m
for j = 1 to n
E[i, j] = min { E[i, j-1] + 1, E[i-1, j] + 1, E[i-1, j-1] + a }
return E[m, n]
๋ฐฐ๋ญ ์ฝ๋ & ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์
๐ฒ ๋ฐฐ๋ญ ๋ฌธ์ ์๋ ์ฝ๋
Knapsack
์ ๋ ฅ : ๋ฐฐ๋ญ์ ์ฉ๋ C, n๊ฐ์ ๋ฌผ๊ฑด๊ณผ ๊ฐ ๋ฌผ๊ฑด i์ ๋ฌด๊ฒ wi์ ๊ฐ์น vi
์ถ๋ ฅ : k[n, C]
// ๋ฐฐ๋ญ ์ฉ๋์ด 0์ผ ๋
for i=0 to n K[i, 0] = 0
// ๋ฌผ๊ฑด 0์ด๋ ์ด๋ค ๋ฌผ๊ฑด๋ ๊ณ ๋ คํ์ง ์
for w=0 to C K[0, w] = 0
for i=1 to n
for w=1 to C // ๋ฐฐ๋ญ์ ์์ ์ฉ๋
if (wi > w) // ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊ฐ ์ฉ๋๋ณด๋ค ์ด๊ณผ
K[i, w] = K[i-1, w] // ํ์ฌ ๋ฐฐ๋ญ ์ฉ๋์ด w์ธ ๊ฒฝ์ฐ์์์ ์ต๋ ๊ฐ์น
else // ๋ฌผ๊ฑด i๋ฅผ ๋ฐฐ๋ญ์ ๋ด์ง ์์ ๊ฒฝ์ฐ์ ๋ด์ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํจ
K[i, w] = max{ K[i-1, w], K[i-1, w-wi] + vi}
return K[n, C]
๐ฒ ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์
์ ๋ ฅ : ๊ฑฐ์ค๋ฆ๋ n์, k๊ฐ์ ๋์ ์ ์ก๋ฉด, d1 > d2 > ... > dk = 1
์ถ๋ ฅ : C[n]
for i = 1 to n C[i] = ๋ฌดํ๋
C[0] = 0
for j = 1 to n
for i = 1 to k
if (di <= j) and (C[j-di] + 1 <= C[j])
C[j] = C[j-di] + 1
return C[n]