๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

DP: Matrix Chain Multiplication (MCM problem)

Dynamic Programming

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํŠน์ •ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ธฐ ๋ณด๋‹ค๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•œ ์ „๋žต ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ธ๋œป ๋ณด๋ฉด Divde-and-Conquer๋ž‘ ๋น„์Šทํ•ด๋ณด์ด์ง€๋งŒ ๋‘˜์€ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

Optimization

DP๋Š” ๋ฌธ์ œ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋” ์ž‘์€ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„ ์ ์ฐจ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋งŒ์•ฝ ์–ด๋–ค ๋ฌธ์ œ์˜ Solution์ด S ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, DP๋Š” S๋ณด๋‹ค ์ž‘์€ ๋ฌธ์ œ๋“ค์˜ ์ตœ์„ ์˜ Solution์„ ๋ชจ๋‘ ๋ชจ์•„ ํ•ฉ์นœ ๊ฒƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋” ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋จผ์ € ํ•ด๊ฒฐํ•จ์œผ๋กœ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—, bottom-up ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

Divde-and-Conquer vs. DP

๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋” ์ž‘์€ ๋ฌธ์ œ๋กœ ์ชผ๊ฐœ์„œ ํ•ด๊ฒฐํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋ฌธ์ œ๋Š” ์ด ๊ณผ์ •์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๋ณด์•„๋„ ํ•œ๋ฒˆ ๊ณ„์‚ฐ ํ–ˆ๋˜ fib(n-1) ์„ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—์„œ ๋˜ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ DP๋Š” ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ–ˆ๋˜ ๊ฐ’๋“ค์€ ๋ฏธ๋ฆฌ table์— ์ €์žฅํ•ด๋‘๊ณ  ๋‹ค์Œ ๊ณ„์‚ฐ์—์„œ ๊ทธ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์˜ ๋ฐ˜๋ณต์ด ์‚ฌ๋ผ์ง„๋‹ค.

Memoization

DP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ, Top-Down approach๋ฅผ ๊ณ„์† ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ recursion์˜ ๋ฌธ์ œ์ ์€ ๊ฐ™์€ ๊ณ„์‚ฐ์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ œ์ผ ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ๊ณ„์‚ฐํ–ˆ์—ˆ๋Š”๋ฐ, Memoization ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ฉด ์ชผ๊ฐœ๋“ค์–ด๊ฐ€๋ฉด์„œ ๊ณ„์‚ฐํ•˜๋ฉด์„œ ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. Memoization์€ ๋‹จ์ˆœํ•˜๊ฒŒ ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ํ•˜๋‚˜์˜ ๊ณ„์‚ฐ์ด ๋๋‚ ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๊ฐ’์„ ๋ฉ”๋ชจํ•ด๋‘๊ณ  ๋‚˜์ค‘์— ๋˜‘๊ฐ™์€ ์—ฐ์‚ฐ์ด ๋‚˜์˜ค๋ฉด ํ…Œ์ด๋ธ”์—์„œ ๊ฐ’๋งŒ ๊บผ๋‚ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

Matrix Chain Multiplication

DP๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ๋ช…ํ•œ ๋ฌธ์ œ๋ฅผ ํ•œ๋ฒˆ ํ’€์–ด๋ณด์ž. Matrix Chain Multiplication์€ ํ–‰๋ ฌ๊ณฑ์…ˆ์ˆœ์„œ ๋ฌธ์ œ์ด๋‹ค. ์–ด๋–ค ๋‹ค์ˆ˜์˜ ํ–‰๋ ฌ์ด ์žˆ์„ ๋•Œ, ๊ด„ํ˜ธ๋ฅผ ์–ด๋””์— ์œ„์น˜์‹œํ‚ค๋Š”์ง€์— ๋”ฐ๋ผ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๊ฐ™์ง€๋งŒ ๊ณฑ์…ˆ์˜ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋‹ฌ๋ผ์ง„๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ํ–‰๋ ฌ์„ ๊ณฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ–‰๋ ฌ์˜ ํฌ๊ธฐ๊ฐ€ ์ค‘์š”ํ•œ๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด p x q ํ–‰๋ ฌ์„ q x r ํ–‰๋ ฌ๊ณผ ๊ณฑํ•œ๋‹ค๋ฉด ์ด ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” p x q x r์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋” ์ž์„ธํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด์ž. ์šฐ๋ฆฌ์—๊ฒŒ ์„ธ๊ฐ€์ง€ ํ–‰๋ ฌ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ํ–‰๋ ฌ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํฌ๊ธฐ๋กœ ์ •ํ•ด์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

  • A = p X q
  • B = q X r
  • C = r X s

๊ด„ํ˜ธ๋ฅผ ํ†ตํ•ด ์„ธ ํ–‰๋ ฌ์˜ ๊ณฑ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์ด ๋‘๊ฐ€์ง€ ์ด๋‹ค.

  1. (A X B) X C
  2. A X (B X C)

1๋ฒˆ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ณ„์‚ฐํ•œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” p X q X r + p X r X s = p X r X (q + s) ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.
2๋ฒˆ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ณ„์‚ฐํ•œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” q X r X s + p X q X s = (p + r) X q X s ๊ฐ€ ๋œ๋‹ค.

 

์ง€๊ธˆ์€ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋ฐ–์— ์—†์œผ๋‹ˆ ํฐ ์ฐจ์ด๊ฐ€ ์—†์–ด ๋ณด์ด๊ฒ ์ง€๋งŒ, ํ–‰๋ ฌ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚จ์— ๋”ฐ๋ผ, ๊ทธ๋ฆฌ๊ณ  ํ–‰๋ ฌ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์—ฐ์‚ฐ ํšŸ์ˆ˜์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์ตœ์†Œํ•œ์˜ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋กœ ํ–‰๋ ฌ์˜ ๊ณฑ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

Brute Force

๋‹จ์ˆœํ•˜๊ฒŒ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๊ณ  ํ•ด๋ณด์ž. ํ–‰๋ ฌ์˜ ๊ฐฏ์ˆ˜ N์ด 2 ์ด์ƒ์ด๋ฉด, ๋ธŒ๋ฃจํŠธ ํฌ์Šค๋ฅผ ์ด์šฉํ•œ ํ•ด๊ฒฐ์ด ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๊ฒฐ๊ตญ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ํ™•์ธํ•ด๋ด์•ผ ํ•˜๋Š”๋ฐ, Ω(2n) ๋งŒํผ์˜ ์‹œ๊ฐ„์„ ์†Œ์š”ํ•˜๊ฒŒ ๋œ๋‹ค.

DP

๊ทธ๋Ÿผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ’€์–ด๋ณด์ž. ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋žจ์€ ํ•ญ์ƒ ๋ช‡๊ฐœ์˜ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ ‘๊ทผํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Step 1: Find Optimal Substructure

Optimal substructure๋Š” ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋” ์ž‘์€ ๋ฌธ์ œ์˜ ์ฒ˜์ ์˜ ์†”๋ฃจ์…˜์„ ์˜๋ฏธํ•œ๋‹ค. ์šฐ์—๊ฒŒ ์ฃผ์–ด์ง„ ํ–‰๋ ฌ์˜ ๊ฐฏ์ˆ˜๊ฐ€ j ๊ฐœ๋งŒํผ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” substructure๋Š” AiAi+1Ak ์™€ Ak+1Ak+2Aj ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

k๋Š” ๊ด„ํ˜ธ๋ฅผ ์œ„์น˜์‹œํ‚ค๋Š” ํ–‰๋ ฌ์„ ์˜๋ฏธํ•˜๊ณ  ํ•ด๋‹น ํ–‰๋ ฌ์˜ ๋‹ค์Œ ํ–‰๋ ฌ๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ํ–‰๋ ฌ๊นŒ์ง€ ๋ฌถ์œผ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ดˆ๊ธฐ์— ๊ฐ€์กŒ๋˜ ํ–‰๋ ฌ์˜ ์ง‘ํ•ฉ์„ ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

Step 2: A Recursive Solution

i๋ฒˆ์งธ ํ–‰๋ ฌ๋ถ€ํ„ฐ j๊นŒ์ง€์˜ ํ–‰๋ ฌ์„ ๊ณฑํ•  ๋•Œ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ณฑ์…ˆ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ m[i, j] ๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž. ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•  ์ตœ์ข…์ ์ธ ๋‹ต์€ ์ฃผ์–ด์ง„ j๊ฐœ์˜ ํ–‰๋ ฌ์— ๋Œ€ํ•œ ์ตœ์†Œํ•œ์˜ ์—ฐ์‚ฐ ํšŸ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— m[i, j] ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

์•ž์„  Step 1 ์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ์ตœ์ ์˜ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ์‹์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด๋ณด์ž.

 

์‹œ์ž‘ ํ–‰๋ ฌ ์œ„์น˜์ธ i ๊ฐ€ ์ฃผ์–ด์ง„ ๊ฐฏ์ˆ˜ j ์™€ ๊ฐ™์€ ๊ฐ’์ด๋ผ๋ฉด ํ–‰๋ ฌ์ด ํ•˜๋‚˜๋ฟ ์ด๋ผ๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ณฑ์…ˆ์˜ ํšŸ์ˆ˜๋Š” 0 ์ด ๋œ๋‹ค. ์ด๊ฒƒ์„ ์‹์œผ๋กœ ์ผ๋ฐ˜ํ™” ํ•˜๋ฉด,

 

if i = j, m[i, j] = 0

 

์ด๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด j ๊ฐ€ i ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–จ๊นŒ? Step 1 ์—์„œ ์„ธ์› ๋˜ ์‹๋Œ€๋กœ ์šฐ๋ฆฌ๋Š” ํ–‰๋ ฌ๋“ค์„ ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ณ„์‚ฐ์„ ํ•ด๋ณด์•„์•ผ ํ•œ๋‹ค. ์ด ์‹์„ ํ‘œํ˜„ํ•˜๋ฉด,

 

if i < j, m[i, j] = m[i, k] + m[k + 1, j] + pi-1pkpj

 

์œ„์™€ ๊ฐ™์ด ๊ฐ ๊ทธ๋ฃน์˜ ์ตœ์†Œ ์—ฐ์‚ฐํšŸ์ˆ˜๋ฅผ ๊ตฌํ•ด์„œ ๋”ํ•˜๊ณ , ๋‘ ๊ทธ๋ฃน์˜ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ ํ–‰๋ ฌ์„ ๊ณฑํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ๋”ํ•ด์ฃผ๋ฉด, ์ „์ฒด ํ–‰๋ ฌ์— ๋Œ€ํ•œ ์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

Step 3: Computing the optimal costs

๊ด„ํ˜ธ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜ k ๋Š” i ≤ k < j ์ž„์„ ๊ธฐ์–ตํ•˜๋ฉด์„œ ์ตœ์ ์˜ cost ๋ฅผ ์ฐพ์•„๋ณด์ž.

1 2 3 4 5 6
2 0 0 0 0 0
3 x A B C K
4 x x 0 0 C
5 x x x 0 B
6 x x x x A

j ๊ฐ€ 6์ด๋ผ๊ณ  ํ•  ๋•Œ, ์ฆ‰ ์ฃผ์–ด์ง„ ํ–‰๋ ฌ์˜ ๊ธธ์ด๊ฐ€ 6์ด๋ผ๊ณ  ํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ m ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ์นธ์€ m[i, j], j ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ํšŸ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

i๋ฅผ 3์ด๋ผ๊ณ  ํ•˜๊ณ  ์ „์ฒด ๊ธธ์ด 6๊นŒ์ง€ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•ด๋ณธ๋‹ค๊ณ  ํ•˜์ž. k ๋Š” i ≤ k < j ์กฐ๊ฑด์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•ด์•ผํ•  ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” k ๊ฐ€ 3์ผ ๋•Œ, 4์ผ ๋•Œ, ๊ทธ๋ฆฌ๊ณ  5์ผ ๋•Œ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

 

์•ž์„œ ์„ธ์› ๋˜ recursion equation์„ ์ ์šฉํ•ด๋ณด๋ฉด,

 

k = 3 ์ผ ๋•Œ, m[3, 6] = m[3, 3] + m[4, 6] + p2p3p6

k = 4 ์ผ ๋•Œ, m[3, 6] = m[3, 4] + m[5, 6] + p2p3p6

k = 5 ์ผ ๋•Œ, m[3, 6] = m[3, 5] + m[6, 6] + p2p3p6

 

์„ธ ๊ฒฝ์šฐ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์„ธ ๊ฐ’์ค‘์— ์ตœ์ข… ์—ฐ์‚ฐ ํšŸ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๊ฒฝ์šฐ๋ฅผ ์„ ํƒํ•˜๋ฉด optimal solution์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ฃผ๋ชฉํ•  ์ ์€, ์šฐ๋ฆฌ๋Š” m[3, 3] ๊ณผ m[6, 6]์ด 0์ด๋ผ๋Š” ๊ฒƒ์„ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ณ  ํ…Œ์ด๋ธ”์—๋„ ๊ธฐ๋ก์„ ํ•ด๋‘์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ๋Œ€๊ฐ์„ ์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ ๋ฐ”๋กœ ์œ„์— ์žˆ๋Š” ๋Œ€๊ฐ์„ ์€ ๋ชจ๋‘ ํ–‰๋ ฌ์„ ๋‘ ๊ฐœ๋งŒ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์ผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ๋‘ ํ–‰๋ ฌ์˜ ๊ณฑ์…ˆ ํšŸ์ˆ˜์ธ pi-1pkpj ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ๋Œ€๊ฐ์„ ์„ ์˜ค์ธจ์œผ๋กœ ํ•˜๋‚˜์”ฉ ์ด๋™์‹œ์ผœ๋‚˜๊ฐ€๋ฉด ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด๋ณผ ํ•„์š”์—†์ด m[1, j]์— ๊ฐ€์žฅ ์ตœ์†Œ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด, ์ด n ๊ฐœ์— ๋Œ€ํ•ด์„œ 2๊ฐœ์˜ ์กฐํ•ฉ์„ ๋ฝ‘์•„ optimal substructure ๋ฅผ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— nC2 + n ์œผ๋กœ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ , ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด, Θ(n2) ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Step 4: Constructing an Optimal Solution

์œ„ ๊ณ„์‚ฐ์„ ํ†ตํ•ด์„œ๋Š” ์ตœ์†Œํ•œ์˜ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋งŒ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๊ณ , k์˜ ์œ„์น˜๋ฅผ ๋”ฐ๋กœ ๊ธฐ์–ตํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” s[i, j]๋ผ๋Š” ๋˜‘๊ฐ™์€ ํ˜•ํƒœ์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ m ๋ฐฐ์—ด์— ์„ ํƒ๋˜๋Š” ์ตœ์ ์˜ k๊ฐ’์„ ๊ธฐ๋กํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿผ ์ „์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ pseudo code๋ฅผ ๋ณด์ž

Matrix-Chain-Order (p)
n = legth[p] - 1
for i = 1 to n
    m[i, i] = 0
for r = 2 ro n
    for i = 1 to n - r + 1
        j = i + r - 1
        m[i, j] = infinite
        for k = i to j - 1
            q = m[i, k] + m[k + 1, j] + p[i-1]p[k]p[j]
            if q < m[i, j]
                m[i, j] = q
                s[i, j] = k

์œ„์—์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด ์ง๊ด€์ ์œผ๋กœ ๋ณด์ด๋Š” ์ฝ”๋“œ์ด๋‹ค. MCM ๋ฌธ์ œ๊ฐ€ [๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜] ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋น„์Šทํ•œ ๋ฌธ์ œ๋กœ ์ถœ์ œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— [๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ฌธ์ œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ํ•ด๊ฒฐํ•ด๋ณด์•˜๋‹ค.

๋ฌธ์ œ: https://www.acmicpc.net/problem/11049

#include <iostream>
#include <algorithm>
#include <climits>

using namespace std;

int main()
{
    int N;
    cin >> N;
    int P[502][502];
    int minCost[502][502];

    for (int i = 1; i <= N; i++)
    {
        cin >> P[i][0];
        cin >> P[i][1];
    }

    for (int l = 2; l <= N; l++)
    {
        for (int i = 1; i <= N - l + 1; i++)
        {
            int j = i + l - 1;
            minCost[i][j] = INT_MAX;
            for (int k = i; k <= j - 1; k++)
            {
                int q = minCost[i][k] + minCost[k + 1][j] + P[i][0] * P[k][1] * P[j][1];
                minCost[i][j] = min(q, minCost[i][j]);
            }
        }
    }
    cout << minCost[1][N];
}

ํ•ด๋‹น ๋ฌธ์ œ์—์„œ๋Š” k ๊ฐ’์„ ๋”ฐ๋กœ ๊ธฐ๋กํ•˜์ง€ ์•Š์•„๋„ ์ตœ์†Œ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋งŒ ๊ตฌํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ถ€๋ถ„์€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ํ•ด๊ฒฐํ–ˆ๋‹ค. ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ k๊ฐ’ ๊นŒ์ง€ ๊ธฐ๋กํ•ด์„œ ๋‘๊ฐœ์˜ ๋ฐฐ์—ด์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•˜๋„๋ก ๋งŒ๋“ค์–ด ๋ณด์ž.

#include <iostream>
#include <algorithm>
#include <climits>

using namespace std;

int main()
{
    int N;
    cin >> N;
    int P[502][502];
    int minCost[502][502];
    int record[502][502];

    for (int i = 1; i <= N; i++)
    {
        cin >> P[i][0];
        cin >> P[i][1];
    }

    for (int l = 2; l <= N; l++)
    {
        for (int i = 1; i <= N - l + 1; i++)
        {

            int j = i + l - 1;
            minCost[i][j] = INT_MAX;
            for (int k = i; k <= j - 1; k++)
            {
                int q = minCost[i][k] + minCost[k + 1][j] + P[i][0] * P[k][1] * P[j][1];
                if (q < minCost[i][j]){
                    minCost[i][j] = q;
                    record[i][j] = k;
                }
            }
        }
    }

    cout << endl;
    cout << "Minimum multiplication: "<< minCost[1][N] << endl;

    cout << endl;
    cout << "Number of optimal multiplication" << endl;
    for (int i = 1 ; i <= N ; i++){
        for(int j = 1 ; j<=N ; j++){
            cout << minCost[i][j] << "\t";
        }
        cout << endl;
    }

    cout << endl;
    cout << "Paranthesis Position" << endl;
    for (int i = 1 ; i <= N ; i++){
        for(int j = 1 ; j<=N ; j++){
            cout << record[i][j] << "\t";
        }
        cout << endl;
    }

}

๋ฐฐ์—ด์„ ํ•ด์„ํ•  ๋•Œ๋Š” ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ด„ํ˜ธ๋กœ ๋‚˜๋ˆŒ ์œ„์น˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ํ•ด์„ํ•˜๋ฉด ๋œ๋‹ค. ๋งŒ์•ฝ ๊ฒฐ๊ณผ์˜ record ๋ฐฐ์—ด์— 1ํ–‰ 6์—ด์˜ ๊ฐ’์ด 3์ด ๋‚˜์™”๋‹ค๋ฉด, 1๋ฒˆ์งธ ํ–‰๋ ฌ๋ถ€ํ„ฐ 6๋ฒˆ์งธ ํ–‰๋ ฌ๊นŒ์ง€ ํ–‰๋ ฌ์—์„œ๋Š” 3๋ฒˆ ํ–‰๋ ฌ ๋’ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ 1, 2, 3 ๋ฒˆ์งธ ํ–‰๋ ฌ์— ๊ด„ํ˜ธ๋ฅผ ์น˜๊ณ , 4, 5, 6 ๋ฒˆ์งธ ํ–‰๋ ฌ์— ๊ด„ํ˜ธ๋ฅผ ์น˜๋ฉด ๋œ๋‹ค.