dp์ ๋ํ ๋ถ์กฑํ ์ดํด๋ฅผ ์ํด ์ฐธ๊ณ ์์ ์์ ๋ฅผ ๊ฐ์ ธ์๋ค. ์์ดํ ๋ฌธ์ ๋ ์ ํ์ ์ธ ๊ทธ๋ํ ๋ฌธ์ ๋ ์๋์ง๋ง dp๋ฅผ ์ด์ฉํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ํ๋ค. ๋ฟ๋ง ์๋๋ผ ๋ถํ ์ ๋ณต ํด๊ฒฐ๊ณผ์ ๋น๊ต๋ฅผ ํตํด dp์ ์ํ ํจ์จ์ ์์๋ณธ๋ค.
๋ฐฐ๊ฒฝ
- n๊ฐ์ ๋์๊ฐ ์๋ ๋๋ผ์ ์ด๊ณ ์๋ค.
- ๋์๋ค์ ์ผ์ง์ ์์ ์์นํ๋ฉฐ 0๋ถํฐ n-1๊น์ง ๋ฒํธ๊ฐ ์๋ค.
- 0๋ฒ ๋์์์ ์ถ๋ฐํด n-1๋ฒ ๋์๋ก ๊ฐ๋ ค๊ณ ํ๋ค.
- ๋์์ ๋์๋ ์ฐ์ธก์ผ๋ก๋ง ์ด๋ํด์ผ ํ๊ณ ํ๋ฃจ์ 1๊ฐ ํญ๊ณตํธ์ ํ ์ ์๋ค.
- ๋์ฐฉํ ๋์์์๋ ๋ฐ๋์ ๊ทธ ๋์์ ํธํ ์ 1๋ฐ์ ํด์ผํ๊ณ ๋ค์ ๋ ์์นจ ์๋ก์ด ํญ๊ณตํธ์ ํ ์ ์๋ค.
์ ์
- ํญ๊ณต ์๊ธ์ ๋์ ๊ตฌ๊ฐ์ด ๋ฉ์๋ก ๋น์ธ๊ณ i(1 <= i <= n-1) ๊ตฌ๊ฐ์ ๋ํ ํญ๊ณต ์๊ธ์ ๋ฐฐ์ด A์ A[i] ์์๊ฐ์ผ๋ก ์ฃผ์ด์ง๋ค.
- ์๋ฐ ์๊ธ์ ๋ฐฐ์ด H[1:n-2]์ ์ฃผ์ด์ง๋ค. ์ถ๋ฐ ๋์, ๋์ฐฉ ๋์์ ์๋ฐ ์๊ธ์ ํฌํจํ์ง ์๋๋ค.
๋ฌธ์
- ์ถ๋ฐ ๋์ 0์์ ๋์ฐฉ ๋์ n-1๊น์ง์ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ผ.
๋ฌธ์ ํด๊ฒฐ์ ๋ํด ๋ถํ ์ ๋ณต๊ณผ dp ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ๊ฐ ํด๊ฒฐํ๋ฉฐ ๋์ ์ฑ๋ฅ์ ๋น๊ตํ๋ค.
๋ฌธ์ ์ ๊ณต๊ฐ์ 1์ฐจ์ ๋ฐฐ์ด์ ๋์ด๋ n๊ฐ์ ๋์๋ค์ด๋ค. ๋ถํ ์ ๋ณต๊ณผ dp ๋ฐฉ๋ฒ ๊ฐ๊ฐ ์ ๋ฐฉํฅ ํด๊ฒฐ๊ณผ ์ญ๋ฐฉํฅ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ ์ด 4๊ฐ์ง์ ์ ๊ทผ ๋ฐฉ์์ด ์กด์ฌํ๋ค.
์ ๋ฐฉํฅ ํด๊ฒฐ
์ ์ถ๋ฐ ๋์๋ฅผ 0์ผ๋ก ๊ณ ์ ํ๊ณ ๋์ฐฉ ๋์๋ฅผ ์ถ๋ฐ ๋์์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋์ 1๋ถํฐ ํ์ฌ n-1(๋ชฉํ ๋์ฐฉ ๋์)๊น์ง ์ ์ง์ ์ผ๋ก ํด๋ฅผ ๊ตฌํ๋ค.
์ญ๋ฐฉํฅ ํด๊ฒฐ
์ ๋์ฐฉ ๋์๋ฅผ n-1๋ก ๊ณ ์ ํ๊ณ ์ถ๋ฐ ๋์๋ฅผ ๋์ฐฉ ๋์์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋์ n-2๋ถํฐ ํ์ฌ 0(๋ชฉํ ์ถ๋ฐ ๋์)๊น์ง ์ ์ง์ ์ผ๋ก ํด๋ฅผ ๊ตฌํ๋ค.
๋ถํ ์ ๋ณต์ ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ผ๋ก์จ ํด๋ฅผ ๊ตฌํ๋ ์์๊ฐ ์ฌ๊ท ํธ์ถ๋ก๋ถํฐ์ ๋ฐํ ์์์ ์ผ์นํ๋ฉฐ ์ฌ๊ท ํธ์ถ ์์์๋ ๋ฐ๋๋ค. ๋ฐ๋ฉด dp๋ ๋น์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ์ผ๋ก์จ ํด๋ฅผ ๊ตฌํ๋ ์์๊ฐ ๊ณ์ฐ ์์์ ๊ทธ๋๋ก ์ผ์นํ๋ค.
๋ํ, ์๋ฐ ๋น์ฉ H[0], H[n-1]์ 0์ ์ ์ฅํ๊ณ ๋ฌธ์ ํด๊ฒฐ์ ์์ํ๋ค.
airtel(n-1) //์ถ๋ฐ 0๋ถํฐ ๋์ฐฉ n-1๋์๊น์ง์ ์ต์ ๋น์ฉ์ ๊ตฌํ๊ณ ์ ํจ
Alg airtel(dest)
input destination city dest
output minCost of city 0 to dest
if(dest = 0){
return 0
}
minCost <- big integer number //์ต์๋น์ฉ ๋งค์ฐ ํฐ ์๋ก ์ด๊ธฐํ
for k <- 0 to dest-1 {
cost <- airtel(k) + H[k] + A[dest-k]
minCost <- min(minCost, cost)
}
return mincost
airtel()์ ๋์ฐฉ ๋์ dest์ ๋ํด ๋์ k๋ฅผ ๊ฒฝ์ ํ ๊ฒฝ์ฐ์ cost๋ฅผ ๊ณ์ฐํด minCost๋ฅผ ๊ตฌํ๋ค.
๊ทธ๋ฆผ์ cost๋ฅผ ๊ตฌํ๋ airtel(k) + H[k] + A[dest-k] ์ํ ๋ด์ฉ์ ๋ํ๋ธ๋ค. airtel(k)๋ ์ถ๋ฐ ๋์์์ k ๋์๊น์ง์ ๋น์ฉ์ ์ฌ๊ทํธ์ถ๋ก ๊ตฌํ๊ณ k ๋์์์์ ์๋ฐ ์๊ธ(H[k]), k ๋์์์ ๋ชฉ์ ์ง dest๊น์ง์ ํญ๊ณต ์๊ธ(A[dest-k])์ ๋ํด ๋์ k๋ฅผ ๊ฒฝ์ ํ๋ ๊ฒฝ์ฐ์ cost๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ด๋ค.
์๊ณ ๋ฆฌ์ฆ ์ํ ์๊ฐ์ O(2^n)์ด๋ค.
airtel(0) //์ถ๋ฐ ๋์๊ฐ 0์ผ ๋์ ๋์ฐฉ ๋์ n-1๊น์ง์ minCost
Alg airtel(start)
input start city start
output minCost of city start to n-1
if(start = n-1) {
return 0
}
minCost <- big integer number
for k <- start+1 to n-1 {
cost <- A[k-start] + H[k] + airtel(k)
minCost <- min(minCost, cost)
}
return minCost
์ญ๋ฐฉํฅ์์์ airtel()์ ์ถ๋ฐ ๋์ start์์ ๋์ k๋ฅผ ๊ฒฝ์ ํ ๋์ minCost๋ฅผ ๊ณ์ฐํ๋ค.
๊ทธ๋ฆผ์ cost๋ฅผ ๊ตฌํ๋ A[k-start] + H[k] + airtel(k) ์ํ ๋ด์ฉ์ ๋ํ๋ธ๋ค. s์์ k๊น์ง์ ํญ๊ณต ์๊ธ, k์์์ ์๋ฐ ๋น์ฉ, k์์ n-1๊น์ง์ minCost๋ฅผ ๋ํด cost๋ฅผ ๊ณ์ฐํ๋ค.
์ญ๋ฐฉํฅ ํด๊ฒฐ์์์ ์ํ ์๊ฐ๋ O(2^n)์ด ๋๋ค. airtel ๋ฌธ์ ์ ๋ํ ๋ถํ ์ ๋ณต ํด๊ฒฐ์ ๊ณผ๋ํ ์ค๋ณต ํธ์ถ๋ก ์ธํด ์๊ฐ ์ฑ๋ฅ์ด ํฌ๊ฒ ์ ํ๋๋ค. ๋์ผํ ํธ์ถ์ด ์ ์์ด ์ค๋ณต๋์ด ๋ฌด๋ ค ์ง์ ์๊ฐ์ด ์์๋๋ค.
dp ๋ฐฉ์์ด ๋ถํ ์ ๋ณต๊ณผ ๋ค๋ฅธ ์ ์ ๋ฐฐ์ด์ ์ค๊ฐ ๊ณ์ฐํ ๊ฐ๋ค์ ๊ธฐ์ต, ์ ์ฅํด ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ์ค๋ณต ์ฐ์ฐ์ ํผํ๋ค๋ ๊ฒ์ด๋ค.
Alg airtel(n)
input integer n
output minCost of city 0 to n-1
minCost[0] <- 0 //์ฐ์ฐ ์ ์ฅํ ๋ฐฐ์ด minCost
for dest<-1 to n-1 {
minCost[dest] <- big integer number
for k<-0 to dest-1 {
cost <- minCost[k] + H[k] + A[dest-k]
minCost[dest] <- min(minCost[dest], cost)
}
}
return minCost[n-1]
minCost๋ผ๋ ์ธ๋ถ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์ฐ์ฐ์ ๊ธฐ์ตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๊ฐ๋ค. minCost[i]๋ ์ถ๋ฐ ๋์ 0๋ถํฐ ๋์ i๊น์ง์ minCost๋ฅผ ์๋ฏธํ๋ค.
์ถ๋ฐ ๋์๋ถํฐ 0๊น์ง์ ๋น์ฉ์ 0์ด๊ธฐ์ minCost[0]์ 0์ ์ ์ฅํ๋ค.
dest๋ ๋์ 1๋ถํฐ ๋ชฉํ ๋์ฐฉ ๋์ n-1๊น์ง๋ฅผ ๋ฐ๋ณตํ๋ฉฐ, ๊ฐ ๋ฐ๋ณต๋ง๋ค 0๋ถํฐ dest๊น์ง์ minCost๋ฅผ ๊ตฌํ๋ค.
๋ด๋ถ ๋ฐ๋ณต๋ฌธ์ dest์ ๋ํด ๋์ k๋ฅผ ๊ฒฝ์ ํ๋ ๋น์ฉ์ ๊ณ์ฐํ๋ค. ๊ทธ๋ฆผ์ cost๋ฅผ ๊ตฌํ๋ ๊ณ์ฐ ๋ด์ฉ์ ๋ํ๋ธ๋ค. minCost[k]๋ ๋ฐฐ์ด์ ์ ์ฅ๋, 0๋ถํฐ k๊น์ง์ minCost์ด๋ค.
Alg airtel(n)
input integer n
output minCost of city 0 to n-1
minCost[n-1] <- 0 //n-1 to n-1 is 0
for start<-n-2 down to 0 {
minCost[start] <- big integer number
for k<-start+1 to n-1 {
cost <- A[k-start] + H[k] + minCost[k]
minCost[start] <- min(minCost[start], cost)
}
}
return minCost[0]
์ญ๋ฐฉํฅ ํด๊ฒฐ์์์ minCost[i]๋ i๋ถํฐ ๋ชฉํ ๋์ฐฉ ๋์ n-1๊น์ง์ ์ต์ ๋น์ฉ์ ๋ปํ๋ค.
start๋ ๋์ n-2๋ถํฐ ๋ชฉํ ์ถ๋ฐ ๋์ 0๊น์ง ๋ฐ๋ณตํ๋ฉฐ, ๊ฐ ๋ฐ๋ณต๋ง๋ค start๋ถํฐ n-1๊น์ง์ minCost๋ฅผ ๊ตฌํ๋ค.
๋ด๋ถ ๋ฐ๋ณต๋ฌธ์ start์ ๋ํด ๋์ k๋ฅผ ๊ฒฝ์ ํ๋ ๋น์ฉ์ ๊ณ์ฐํ๋ค. ๊ทธ๋ฆผ์ cost๋ฅผ ๊ตฌํ๋ ๊ณ์ฐ ๋ด์ฉ์ด๋ค. minCost[k]๋ ๋ฐฐ์ด์ ์ ์ฅ๋, k๋ถํฐ n-1๊น์ง์ minCost๋ค.
dp๋ฅผ ์ด์ฉํ airtel ์์ ํด๊ฒฐ ์ํ ์๊ฐ์ O(n^2)
๋ก ์ฑ๋ฅ์ด ๊ฐ์ ๋๋ค. dp๋ ์ค๋ณต๋๋ ๋ฌธ์ ๋ค์ ๋ํด ์์ ์ธ๋ถ ๋ฐฐ์ด์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค๊ฐ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ค๋ณต์ ํด๊ฒฐํ๊ณ ์ ํ๋ค๋ ๊ฒ์ด ํต์ฌ์ด๋ค.
์ฐธ๊ณ : ๊ตญํ์ค. ์๊ณ ๋ฆฌ์ฆ ์๋ฆฌ์ ์์ฉ. 21์ธ๊ธฐ์ฌ, 2018.