์ด ์˜์—ญ์„ ๋ˆ„๋ฅด๋ฉด ์ฒซ ํŽ˜์ด์ง€๋กœ ์ด๋™
caputdraconis ๋ธ”๋กœ๊ทธ์˜ ์ฒซ ํŽ˜์ด์ง€๋กœ ์ด๋™

caputdraconis

ํŽ˜์ด์ง€ ๋งจ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๊ธฐ

caputdraconis

๋„คํŠธ์›Œํฌ ๊ด€์ ์—์„œ์˜ ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ…์„ ๊ณต๋ถ€ํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค :)

[Algorithms] Dynamic Programming

  • 2023.05.26 12:51
  • ๐Ÿฅš๊ณ ๋ฆฌ์ฆ˜
๊ธ€ ์ž‘์„ฑ์ž: caputdraconis
๋ฐ˜์‘ํ˜•

 

 

/*
	๊ฐ•์˜ ์ •๋ฆฌ
*/

Dynamic Programming(๋™์ ๊ณ„ํš๋ฒ•) ์ด๋ž€?

์ฒ˜์Œ์— ์ฃผ์–ด์ง„ ํฐ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์–ด๋ž? Divide&Conquer(๋ถ„ํ• ์ •๋ณต๊ธฐ๋ฒ•)๋ž‘ ๊ฐ™์€๊ฑฐ ์•„๋‹Œ๊ฐ€? ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํฐ ์ฐจ์ด์  ํ•˜๋‚˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Dynamic Programming ์€ ์ค‘๋ณต ๊ณ„์‚ฐ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. Divide&Conquer ์—์„œ๋Š” ํฐ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆˆ ํ›„์—, ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐํ•ฉํ•ด ์œ— ๋‹จ๊ณ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์ด์˜€์Šต๋‹ˆ๋‹ค. Dynamic Programming ์—์„œ๋Š” ์ด์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋‚˜๋ˆ ์ง„ ์ž‘์€ ๋ฌธ์ œ๋“ค ์ค‘ ์ด๋ฏธ ์•ž์— ๊ณ„์‚ฐํ•œ ์ ์ด ์žˆ๋Š” ์—ฐ์‚ฐ์ด๋ผ๋ฉด ์ด๋ฅผ ์ค‘๋ณตํ•ด์„œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ์ด์ „์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์ „ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•œ๋‹ค๋Š” ํŠน์ง• ๋•Œ๋ฌธ์—, Divide&Conquer ๋ณด๋‹ค ์ถ”๊ฐ€์ ์ธ Space ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Dynamic Programming ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด

๋ชจ๋“  ๋ฌธ์ œ์— ์ด๋Ÿฐ Dynamic Programming ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ.. ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค.
1. Overlapping Subproblems : ์ž„์˜์˜ Subproblem์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋งŒ๋‚œ๋‹ค -> ์—ฌ๋Ÿฌ๋ฒˆ ๋งŒ๋‚˜์•ผ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ ์ €์žฅํ•œ ๋ณด๋žŒ์ด ์žˆ์œผ๋‹ˆ๊น์š”!
2. Optimal Substructure : ํ˜„์žฌ ๋งŒ๋‚œ subproblem ์€ ๊ทธ ๋ฌธ์ œ์˜ substructure ์„ ์ด์šฉํ•ด ํ•ด๊ฒฐํ•œ๋‹ค. ์ด๋•Œ ๊ทธ ๋ฌธ์ œ์˜ subproblem ๋˜ํ•œ Optimal ํ•ด์•ผ ํ•œ๋‹ค.

Dynamic Programming ์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

Dyanmic Programming ์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€์˜ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
1. top-down approach(ํ•˜ํ–ฅ์‹ ์ ‘๊ทผ) : ํฐ ๋ฌธ์ œ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•ด์„œ ๋”์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ์ชผ๊ฐœ๊ณ  ํ•ด๊ฒฐ. ๋ณดํ†ต ์žฌ๊ท€(Recursion) ์œผ๋กœ ๊ตฌํ˜„
2. bottom-up approach(์ƒํ–ฅ์‹ ์ ‘๊ทผ) : ์ฒ˜์Œ๋ถ€ํ„ฐ ์ž‘์€ ๋ฌธ์ œ๋กœ ์‹œ์ž‘ํ•˜๊ณ , ๋ฌธ์ œ์˜ ํฌ๊ธฐ๋ฅผ ์ ์  ๋Š˜๋ ค๊ฐ€๋ฉฐ ํ•ด๊ฒฐ. ๋ณดํ†ต ๋ฐ˜๋ณต๋ฌธ(Loop) ์œผ๋กœ ๊ตฌํ˜„

๋ณธ ํฌ์ŠคํŒ…์—์„œ๋Š” ํ•˜ํ–ฅ์‹ ์ ‘๊ทผ ๋ฐฉ์‹์˜ Dynamic Programming ๋งŒ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

Dynamic Programming Version of a Recursive Algorithm(Top-Down Approach)

Dynamic Programming ์€ ์•ž์„œ ์„œ์ˆ ํ–ˆ๋“ฏ์ด ์ค‘๋ณต ์—ฐ์‚ฐ์„ ์—†์• ๊ณ  ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•จ์œผ๋กœ์จ, ๊ณต๊ฐ„๊ณผ ์†๋„๋ฅผ ๊ฑฐ๋ž˜ํ•œ ์…ˆ์ด ๋ฉ๋‹ˆ๋‹ค. Subproblems ๋“ค์˜ ์†”๋ฃจ์…˜(์—ฐ์‚ฐ ๊ฒฐ๊ณผ)๋“ค์€ soln ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ๋ฐฐ์—ด์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. Subproblem Q๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋•Œ, ์žฌ๊ท€๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „ ๋จผ์ € soln ์— ์ €์žฅ๋œ ์†”๋ฃจ์…˜์ด ์žˆ๋Š”์ง€ ๋จผ์ € ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ’์ด ์ด๋ฏธ ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žฌ๊ท€๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์—†๋‹ค๋ฉด ์žฌ๊ท€๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ soln ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Dynamic Programming ์˜ ์˜ˆ์‹œ๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” Pseudo-Code ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Dynamic Programming ์˜ ๋‘๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ Bottom-Up Approach ๋ฐฉ์‹์˜ Pseudo-Code ๋„ ์ž‘์„ฑํ•ด๋†“์•˜์Šต๋‹ˆ๋‹ค.

// Top-Down Approach
fipDPwrap_td(n) // n : ๊ตฌํ•˜๋ ค๋Š” ํ”ผ๋ณด๋‚˜์น˜ n๋ฒˆ์งธ ํ•ญ
	Dict soln = create(n); // size๊ฐ€ n+1 ์ธ Array ์ƒ์„ฑ
	return fibDP_td(soln, n); // Entry Point

fibDP_td(soln, k)
	int fib, f1, f2;
	if (k < 2) 
		fib = k;
	else
		if (member(soln, k-1) == false) // ํ”ผ๋ณด๋‚˜์น˜ k-1 ๋ฒˆ์งธ ํ•ญ์ด ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๋‚˜์š”..?
			f1 = fibDP_td(soln, k-1); // ๊ทธ๋Ÿฌ๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๊ณ„์‚ฐ!
		else // ํ— k-1 ๋ฒˆ์งธ ํ•ญ์ด ์ €์žฅ๋˜์–ด ์žˆ๋‚˜์š”?
			f1 = retrieve(soln, k-1); // ๊ทธ๋Ÿฌ๋ฉด ๊ฐ€์ ธ์™€!
		if (member(soln, k-2) == false) // ํ”ผ๋ณด๋‚˜์น˜ k-2 ๋ฒˆ์งธ ํ•ญ์ด ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๋‚˜์š”..?
			f2 = fibDP_td(soln, k-2); // ๊ทธ๋Ÿฌ๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๊ณ„์‚ฐ!
		else // ํ— k-2 ๋ฒˆ์งธ ํ•ญ์ด ์ €์žฅ๋˜์–ด ์žˆ๋‚˜์š”?
			f2 = retrieve(soln, k-2); // ๊ทธ๋Ÿฌ๋ฉด ๊ฐ€์ ธ์™€!
        
		fib = f1 + f2; // ์œ„์—์„œ ๊ณ„์‚ฐ ๋˜๋Š” ๊ฐ€์ ธ์˜จ k-1 ๋ฒˆ์งธ, k-2 ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๋”ํ•ด์„œ k ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ
	store(soln, k, fib); // ์ด๋ฒˆ์— ๊ณ„์‚ฐํ•œ k ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ soln ์— ์ €์žฅ. ๋‚˜์ค‘์— ๋˜ ์จ๋จน์–ด์•ผ์ง€
	return fib; // ๊ณ„์‚ฐํ•œ ๊ฐ’ ๋ฐ˜ํ™˜
// Bottom-Up Approach

fipDPwrap_bu(n) // n : ๊ตฌํ•˜๋ ค๋Š” ํ”ผ๋ณด๋‚˜์น˜ n๋ฒˆ์งธ ํ•ญ
	Dict soln = create(n); // size๊ฐ€ n+1 ์ธ Array ์ƒ์„ฑ
	return fibDP_bu(soln, n); // Entry Point

fibDP_bu(soln, k)
	int fib, f1, f2;
	if (k < 2) 
		fib = k;
	else
		if (member(soln, k-1) == false) // ํ”ผ๋ณด๋‚˜์น˜ k-1 ๋ฒˆ์งธ ํ•ญ์ด ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๋‚˜์š”..?
			f1 = fibDP_bu(soln, k-1); // ๊ทธ๋Ÿฌ๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๊ณ„์‚ฐ!
		else // ํ— k-1 ๋ฒˆ์งธ ํ•ญ์ด ์ €์žฅ๋˜์–ด ์žˆ๋‚˜์š”?
			f1 = retrieve(soln, k-1); // ๊ทธ๋Ÿฌ๋ฉด ๊ฐ€์ ธ์™€!
		if (member(soln, k-2) == false) // ํ”ผ๋ณด๋‚˜์น˜ k-2 ๋ฒˆ์งธ ํ•ญ์ด ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๋‚˜์š”..?
			f2 = fibDP_bu(soln, k-2); // ๊ทธ๋Ÿฌ๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๊ณ„์‚ฐ!
		else // ํ— k-2 ๋ฒˆ์งธ ํ•ญ์ด ์ €์žฅ๋˜์–ด ์žˆ๋‚˜์š”?
			f2 = retrieve(soln, k-2); // ๊ทธ๋Ÿฌ๋ฉด ๊ฐ€์ ธ์™€!

 

Matrix-Chain Multiplication

Dynamic Programming ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์œ„์˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ ๋ง๊ณ ๋„ ๋˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ฒด์ธ์ฒ˜๋Ÿผ ์ด์–ด์ง„ ํ–‰๋ ฌ์„ ๊ณฑํ•˜๋Š” ์—ฐ์‚ฐ์—์„œ, ์ตœ์†Œ ์—ฐ์‚ฐ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ˆœ์„œ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ Matrix-Chain Multiplication ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฒด์ธ์ฒ˜๋Ÿผ ์ด์–ด์ง„ n ๊ฐœ์˜ ํ–‰๋ ฌ $<A_{1}, A_{2}, ..., A_{n}>$ ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์šฐ๋ฆฌ๋Š” $A_{1} * A_{2} * A_{3} * ... A_{n}$ ์˜ ๊ฒฐ๊ณผ๋ฅผ ์—ฐ์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ•  ๋•Œ ํ•„์š”ํ•œ ์—ฐ์‚ฐ๋Ÿ‰์€ ์•„๋ž˜์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ $A_{1}$ = 30 x 1, $A_{2}$ = 1 x 40, $A_{3}$ = 40 x 10, $A_{4}$ = 10 x 25 ์™€ ๊ฐ™์ด ํ–‰๋ ฌ์ด ๋“ค์–ด์™”๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

1. $((A_{1}*A_{2})*A_{3})*A_{4}$ : 30 x 1 x 40 + 30 x 40 x 10 + 30 x 10 x 25 = 20,700 ๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ํ•„์š”
2. $A_{1}*(A_{2}*(A_{3}*A_{4}))$ : 40 x 10 x 25 + 1 x 40 x 25 + 30 x 1 x 25 = 11,750 ๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ํ•„์š”
3. $(A_{1}*A_{2})*(A_{3}*A_{4})$ : 30 x 1 x 40 + 40 x 10 x 25 + 30 x 40 x 25 = 41,200 ๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ํ•„์š”
4. $A_{1}*((A_{2}*A_{3})*A_{4})$ : 1 x 40 x 10 + 1 x 10 x 25 + 30 x 1 x 25 = 1,400 ๋ฒˆ์˜ ์—ฐ์‚ฐ์ด ํ•„์š”

์œ„์™€ ๊ฐ™์ด ๊ด„ํ˜ธ๋ฅผ ์–ด๋””์— ์”Œ์šฐ๋ƒ์— ๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ ์—ฐ์‚ฐ๋Ÿ‰์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์œ„ ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ค‘ 4๋ฒˆ์งธ์™€ ๊ฐ™์ด ์ตœ์†Œ ์—ฐ์‚ฐ์œผ๋กœ ํ–‰๋ ฌ์˜ ๊ณฑ์…ˆ์„ ํ•  ์ˆ˜ ์žˆ๋Š”, Optimal Parenthesization ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Step 1. The structure of an Optimal Parenthesization

Ai ๋ถ€ํ„ฐ Aj ๊นŒ์ง€์˜ ํ–‰๋ ฌ์„ index k ๊ธฐ์ค€์œผ๋กœ ๋‘๊ฐœ์˜ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ $A_{i}$~$A_{k}$ ์™€ $A_{k+1}$~$A_{j}$ ์™€ ๊ฐ™์ด ๋‚˜๋‰˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ k ๋Š” i ≤ k < j ์˜ ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ Cost(๊ณฑ์…ˆ ์—ฐ์‚ฐ ์ˆ˜)๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

$  Cost\,=\,(cost\,of\,computing\,A_{i..k})\,+\,(cost\,of\,computing\,A_{k+1..j})\,+\,(cost\,of\,multiplying\,them)$

$ A_{i}$~$A_{k} $๊นŒ์ง€ ๊ณฑ์…ˆ ์—ฐ์‚ฐ ํ›„ ๋‚˜์˜จ ๊ฒฐ๊ณผ ํ–‰๋ ฌ์„ X, $ A_{k+1}$~$A_{j}$ ๊นŒ์ง€ ๊ณฑ์…ˆ ์—ฐ์‚ฐ ํ›„ ๋‚˜์˜จ ๊ฒฐ๊ณผ ํ–‰๋ ฌ์„ Y ๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, ์ตœ์ข… ๊ฒฐ๊ณผ ํ–‰๋ ฌ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ X ์™€ Y ๋ฅผ ๊ณฑ์…ˆ ์—ฐ์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋“œ๋Š” ๋น„์šฉ์ด ๋งˆ์ง€๋ง‰์— ๋”ํ•ด์ฃผ๋Š” ํ•ญ์ž…๋‹ˆ๋‹ค.

์ด๋•Œ, $ A_{i}$~$A_{k}$ ์™€ $ A_{k+1}$~$A_{j} $ ๋Š” ์–ด๋– ํ•œ k ๊ฐ’์— ๋Œ€ํ•ด์„œ optimal ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜๋Š” k ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Step 2. A Recursive Solution

์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ 2 ๊ฐœ์˜ Dynamic Table ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. m table ๊ณผ s ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค.

m table
Ai..Aj ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ํ•„์š”ํ•œ Scalar Multiplications ์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ i์™€ j๊ฐ€ ๋‘˜๋‹ค 0 ์ผ ๋•Œ, m[i, j] ๋Š” 0์ž…๋‹ˆ๋‹ค. A0 ~ A0 ๊นŒ์ง€ ๊ณฑํ•˜๋Š” ์—ฐ์‚ฐ์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 
$ m[i,j] = min\,{m[i,\,k]\,+\,m[k+1,\,j]\,+\,p_{i-1}p_{k}p_{j}}\,\,(if\,\,i<j) $
$ m[i,\,k]\,=\,p_{i-1}\,*\,p_{k} $
$ m[k+1,\,j]\,=\,p_{k}\,*\,p_{j} $
$ p_{i-1}p_{k}p_{j} $ : i~k ์™€ k+1~j  ์˜ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ 2๊ฐœ์˜ ํ–‰๋ ฌ์„ ๊ณฑํ•˜๋Š” ๋ฐ์— ํ•„์š”ํ•œ ์—ฐ์‚ฐ ์ˆ˜

s table
m table ํŠน์ •ํ•œ k ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์—ฐ์‚ฐํ–ˆ์„ ๋•Œ, ํ•„์š”ํ•œ ์—ฐ์‚ฐ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” table ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, s table ์€ ๊ทธ k ์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” table ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค s table ์€ ๋ฐ‘์—์„œ ํ•  step 4 ์—์„œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, step 4๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋ฉด s table ์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

์ž…๋ ฅ๊ฐ’์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ํ–‰๋ ฌ์˜ ์ˆ˜๋ฅผ n ๊ฐœ๋ผ๊ณ  ํ•  ๋•Œ, ๋‘ ๊ฐœ์˜ table ๋ชจ๋‘ n x n ํ˜•ํƒœ์˜ 2์ฐจ์› ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. 

Step 3. Computing the Optimal Costs

์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ, Optimal Costs ๋ฅผ ๊ตฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € Pseudo-Code ์ž…๋‹ˆ๋‹ค.

MATRIX-CHAIN-ORDER(p)
	n <- length[p] - 1 // ํ–‰๋ ฌ์˜ ์ฐจ์› ์ž…๋ ฅ๊ฐ’์ธ p ๋Š”, ํ–‰๋ ฌ์˜ ๊ฐœ์ˆ˜ + 1 ๊ฐœ์ž…๋‹ˆ๋‹ค.
	for i <- to n
		m[i, i] <- 0 // m table ์˜ ๋Œ€๊ฐ์„ ์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
	for l <- 2 to n // l : 2~n // Chain Length
		for i <- 1 to n - l + 1
			j <- i + l - 1
			m[i, j] <- ∞
			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 // Optimal Costs ์—…๋ฐ์ดํŠธ
					s[i, j] <- k // Optimal Costs ๊ฐ€ ๋ฐœ์ƒํ•œ k ๊ฐ’ ์ €์žฅ/์—…๋ฐ์ดํŠธ
	return m and s

$ A_{1} = 30\ast1, A_{2}=1\ast40, A_{3}=40\ast10, A_{4}=10\ast25$
์˜ˆ์‹œ๋กœ ์‚ฌ์šฉํ•  ํ–‰๋ ฌ์ด ์œ„์™€ ๊ฐ™์„ ๋•Œ, ์œ„ ์ฝ”๋“œ์˜ ์ˆ˜ํ–‰ ๋ฐฉ์‹์„ ๊ทธ๋ฆผ์œผ๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

m table ์—์„œ j<i ์ธ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š”, j<i ๋ผ๋ฉด $A_{i} ~ A_{j}$์˜ ํ–‰๋ ฌ ๊ณฑ์ด ์ •์˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์•ž ํ–‰๋ ฌ์ด i ๋ฒˆ์งธ, ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ํ–‰๋ ฌ์ด j ๋ฒˆ์งธ์—ฌ์•ผ ํ•˜๋ฏ€๋กœ, j๊ฐ€ i ๋ณด๋‹ค ์ž‘์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋น„์Šทํ•œ ์ด์œ ๋กœ s table์—์„œ j <= i ์ธ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. j=i ์ผ ๋•Œ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š”, s table ์€ $A_{i} ~ A_{j} $์‚ฌ์ด์— ๋‚˜๋ˆ„๋Š” ์ง€์  k ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ์ธ๋ฐ i์™€ j ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋‚˜๋ˆ„๋Š” ์ง€์  k ๋„ ์ •์˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์œ„์—์„œ ๊ณ„์‚ฐํ•œ ๋ฐฉ์‹์œผ๋กœ, ์šฐ๋ฆฌ๋Š” Optimal Costs ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Step 4. Constructing an Optimal Solution

์•ž์—์„œ ๊ตฌํ•œ ์ตœ์†Œ ๋น„์šฉ์ด ๋“œ๋Š” ์ˆœ์„œ(๊ณผ์ •)์„ ๋งŒ๋“œ๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•ž์„œ 1,400 ๋ฒˆ์˜ ๊ณฑ์…ˆ ์—ฐ์‚ฐ์ด ์ตœ์†Œ ๋น„์šฉ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ๋Š” ์ด ๊ณฑ์…ˆ ์—ฐ์‚ฐ์ด ๋ฐœ์ƒํ•˜๋Š” Optimal Parenthesization(Solution) ์„ ๋งŒ๋“œ๋Š” ๋‹จ๊ณ„๋กœ, ์ด ๋‹จ๊ณ„์—์„œ ์ฐพ์•„๋‚ด๋Š” ๊ฒฐ๊ณผ๋Š” A1*((A2*A3)*A4) ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ด ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” Pseudo-Code ์ž…๋‹ˆ๋‹ค.

PRINT_OPTIMAL_PARENS(s, i, j)
	if i = j // Base Case
		then print "A"i // Ai ๋ฅผ ์ถœ๋ ฅ. 
	else
		print "(" // ์—ฌ๋Š” ๊ด„ํ˜ธ ์ถœ๋ ฅ
		PRINT_OPTIMAL_PARENS(s, i, s[i, j]) // s[i, j] ๋Š” k ๊ฐ’์„ ์˜๋ฏธ. i~k
		PRINT_OPTIMAL_PARENS(s, s[i, j] + 1, j) // k+1 ~ j
		print ")" // ๋‹ซ๋Š” ๊ด„ํ˜ธ ์ถœ๋ ฅ

์œ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆ˜ํ–‰ ๋ฐฉ์‹์€ ์•„๋ž˜์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํŠธ๋ฆฌ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ˆ˜ํ–‰ ์‹œ๊ฐ„์„ ๋ถ„์„ํ•ด๋ณด๋ฉด, ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋Š” ์ƒ์ˆ˜ ์‹œ๊ฐ„(O(1))์— ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Proper Binary Tree ๋ผ๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, Leaf Node ๊ฐ€ n ๊ฐœ๋ผ๊ณ  ํ•  ๋•Œ, Internal Node ๋Š” n-1 ๊ฐœ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ์˜ ์ด ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€ O(2n+1) time == O(n) time ์ž…๋‹ˆ๋‹ค. ์ฆ‰ Linear time ์— ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋ณด๋ฉด, ์œ„ ์ฝ”๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” s table ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ O(n^2) space ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

 

 

Dynamic Programming ๋ฅผ ํ™œ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. Top-Down Approach, Bottom-Up Approach ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋‘ ํ’€์–ด๋ณด์‹œ๋Š”๊ฑธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
- LeetCode
- Baekjoon

 

Fibonacci Number - LeetCode

Can you solve this real interview question? Fibonacci Number - The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such that each number is the sum of the two preceding ones, starting from 0 and 1. That is, F(0) = 0

leetcode.com

 

2747๋ฒˆ: ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 0๊ณผ 1๋กœ ์‹œ์ž‘ํ•œ๋‹ค. 0๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 0์ด๊ณ , 1๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 1์ด๋‹ค. ๊ทธ ๋‹ค์Œ 2๋ฒˆ์งธ ๋ถ€ํ„ฐ๋Š” ๋ฐ”๋กœ ์•ž ๋‘ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์˜ ํ•ฉ์ด ๋œ๋‹ค. ์ด๋ฅผ ์‹์œผ๋กœ ์จ๋ณด๋ฉด Fn = Fn-1 + Fn-2 (n ≥ 2)๊ฐ€

www.acmicpc.net

 

์ œ๊ฐ€ LeetCode ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// Top-Down Approach
class Solution
{
private:
    int F[33];

public:
    int fibon(int n)
    {
        int ans, f1, f2;
        if (n < 2)
            return n;
        else
        {
            if (F[n - 1] == -1)
                f1 = fibon(n - 1);
            else
                f1 = F[n - 1];

            if (F[n - 2] == -1)
                f2 = fibon(n - 2);
            else
                f2 = F[n - 2];

            ans = f1 + f2;
            F[n] = ans;
            return ans;
        }
    }

    int fib(int n)
    {
        memset(F, -1, 33 * sizeof(int));
        int ans = fibon(n);
        return ans;
    }
};
// Bottom-Up Approach

class Solution {
public:
    int fib(int n) {
        if (n==0) return 0;
        int *F = new int[n+1]; // Array
        F[0] = 0; F[1] = 1; // Initialization
        for (int i=2; i<=n; i++) 
            F[i] = F[i-1] + F[i-2];
        return F[n];
    }
};

 

Top-Down Approach ์ˆ˜ํ–‰์‹œ๊ฐ„/๊ณต๊ฐ„๋ณต์žก๋„
Bottom-Up Approach ์ˆ˜ํ–‰์‹œ๊ฐ„/๊ณต๊ฐ„๋ณต์žก๋„

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€

์ด ๊ธ€ ๊ณต์œ ํ•˜๊ธฐ

  • ๊ตฌ๋…ํ•˜๊ธฐ

    ๊ตฌ๋…ํ•˜๊ธฐ

  • ์นด์นด์˜คํ†ก

    ์นด์นด์˜คํ†ก

  • ๋ผ์ธ

    ๋ผ์ธ

  • ํŠธ์œ„ํ„ฐ

    ํŠธ์œ„ํ„ฐ

  • Facebook

    Facebook

  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ

    ์นด์นด์˜ค์Šคํ† ๋ฆฌ

  • ๋ฐด๋“œ

    ๋ฐด๋“œ

  • ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ

    ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ

  • Pocket

    Pocket

  • Evernote

    Evernote

๋‹ค๋ฅธ ๊ธ€

  • [Algorithms] String(Pattern) Matching

    [Algorithms] String(Pattern) Matching

    2023.06.01
  • [C++] ๋ฐฑ์ค€ BOJ 21939 ๋ฌธ์ œ ์ถ”์ฒœ ์‹œ์Šคํ…œ Version 1

    [C++] ๋ฐฑ์ค€ BOJ 21939 ๋ฌธ์ œ ์ถ”์ฒœ ์‹œ์Šคํ…œ Version 1

    2021.11.18
  • [C++] ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ(2021 ์นด์นด์˜ค ์ฑ„์šฉ์—ฐ๊ณ„ํ˜• ์ธํ„ด์‹ญ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ)

    [C++] ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ(2021 ์นด์นด์˜ค ์ฑ„์šฉ์—ฐ๊ณ„ํ˜• ์ธํ„ด์‹ญ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ)

    2021.11.03
  • [Python] ์ˆซ์ž ๋ฌธ์ž์—ด๊ณผ ์˜๋‹จ์–ด(2021 ์นด์นด์˜ค ์ฑ„์šฉ์—ฐ๊ณ„ํ˜• ์ธํ„ด์‹ญ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ)

    [Python] ์ˆซ์ž ๋ฌธ์ž์—ด๊ณผ ์˜๋‹จ์–ด(2021 ์นด์นด์˜ค ์ฑ„์šฉ์—ฐ๊ณ„ํ˜• ์ธํ„ด์‹ญ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ)

    2021.11.03
๋‹ค๋ฅธ ๊ธ€ ๋” ๋‘˜๋Ÿฌ๋ณด๊ธฐ

์ •๋ณด

caputdraconis ๋ธ”๋กœ๊ทธ์˜ ์ฒซ ํŽ˜์ด์ง€๋กœ ์ด๋™

caputdraconis

  • caputdraconis์˜ ์ฒซ ํŽ˜์ด์ง€๋กœ ์ด๋™

๊ฒ€์ƒ‰

๋ฉ”๋‰ด

    ์นดํ…Œ๊ณ ๋ฆฌ

    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (168)
      • Cloud (3)
      • Computer Network (12)
      • Database (2)
      • Terraform (2)
      • ๐Ÿฅš๊ณ ๋ฆฌ์ฆ˜ (13)
      • ๊ฒ…๋ถ€๊ฒ…๋ถ€๐Ÿ™ƒ (10)
        • Naver CS50 ์ฝ”์นญ์Šคํ„ฐ๋”” (2)
        • Machine Learning (1)
        • Computing System (6)
      • ์–ธ์–ด&ํ”„๋ ˆ์ž„์›Œํฌ (20)
        • Python (4)
        • Django (10)
        • Node JS (1)
        • C++ (2)
        • Java (1)
        • Flutter (2)
      • Security (76)
        • WebHacking Study (11)
        • ์ง€์˜ฅ๋ฐฉ ์Šคํ„ฐ๋”” (22)
        • ์—ฌ๋ฆ„๋ฐฉํ•™ ์Šคํ„ฐ๋”” (2)
        • PWN Study (6)
        • SUA Reversing Study (3)
        • PWN (3)
        • WebHacking (20)
        • Reversing (4)
      • ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋„์›€๋˜์ง€ ์•Š์„๊นŒ,,? (23)
      • ์ผ์ƒ๋‹ค๋ฐ˜์‚ฌ (1)
      • ๊ทผํ™ฉ ์ •๋ฆฌ (1)
      • 42 Seoul (1)
        • Setting (1)

    ์ตœ๊ทผ ๊ธ€

    ์ธ๊ธฐ ๊ธ€

    ๋Œ“๊ธ€

    ๊ณต์ง€์‚ฌํ•ญ

    ์•„์นด์ด๋ธŒ

    ํƒœ๊ทธ

    • ์›นํ•ดํ‚น.kr
    • ๋ฆฌ์ŠคํŠธํ•จ์ˆ˜
    • ํŒŒ์ด์ฌ
    • ๋“œ๋ฆผํ•ต
    • ํŒŒ์ด์ฌํ•จ์ˆ˜
    • old-16
    • Python
    • ํŒŒ์ด์ฌ๊ธฐ์ดˆ

    ๋‚˜์˜ ์™ธ๋ถ€ ๋งํฌ

    • Github
    • solved.ac
    • caputdraconis@kakao.com

    ์ •๋ณด

    caputdraconis์˜ caputdraconis

    caputdraconis

    caputdraconis

    ๋ธ”๋กœ๊ทธ ๊ตฌ๋…ํ•˜๊ธฐ

    • ๊ตฌ๋…ํ•˜๊ธฐ
    • RSS ํ”ผ๋“œ

    ๋ฐฉ๋ฌธ์ž

    • ์ „์ฒด ๋ฐฉ๋ฌธ์ž
    • ์˜ค๋Š˜
    • ์–ด์ œ

    ํ‹ฐ์Šคํ† ๋ฆฌ

    • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
    • ์ด ๋ธ”๋กœ๊ทธ ๊ด€๋ฆฌํ•˜๊ธฐ
    • ๊ธ€์“ฐ๊ธฐ
    Powered by Tistory / Kakao. Copyright © caputdraconis.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”