dip idynamic programming f( n ) { if (n < 2) return n 2 f...

Post on 03-Jan-2020

7 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

กาหนดการพลวตกาหนดการพลวตกาหนดการพลวตกาหนดการพลวตD i P iD i P iDynamic ProgrammingDynamic Programming

จานวนฟโบนกช จานวนฟโบนกช (Fibonacci)(Fibonacci)

f = f + ffn = fn – 1 + fn – 2

f = 0 f = 1f( n ) {

f0 = 0, f1 = 1Top-down

if (n < 2) return nreturn f(n - 1) + f(n - 2)

}}

2f(3)

11f(2) f(1)

1 0f(1) f(0)

เวลาการทางานเวลาการทางาน

Intel P8400 2.26GHz, Java 6u14

วเคราะหเวลาการทางานวเคราะหเวลาการทางานf( n ) {if (n < 2) return nreturn f(n - 1) + f(n - 2)

}}ให t(n) แทนจานวนครงทเรยก f(n) จะได

t(n) = t(n – 1) + t(n – 2) + 1, t(0) = 1, t(1) = 1

n = 0 1 2 3 4 5 6 7 8n = 0 1 2 3 4 5 6 7 8f(n) = 0 1 1 2 3 5 8 13 21

t( ) 2f( +1) 1

t(n) = 1 1 3 5 9 15 25 41 67

( n )t(n) = 2f(n+1) – 1

61803151)1()( nn

f

( n )

...61803.12

51,5

)1()(

nf

ชาเพราะคานวณซา ๆชาเพราะคานวณซา ๆf( n ) {if (n < 2) return nreturn f(n - 1) + f(n - 2)

}5

Overlapping

}

f(4)3

f(3)2

f(5)Overlapping Subproblems

f(4)2 1

f(3)1 1

f(3)

f(2) f(1)11

f(2)

f(1) f(0)01

f(2)01

f(1)

f(1) f(0)f(2) f(1)1 0

f(1) f(0) f(1) f(0)

f(1) f(0)

หลกเลยงการคานวณซาดวยการจาหลกเลยงการคานวณซาดวยการจาf(n, ) {F[0..n]

( )if (n < 2) return nreturn f(n-1, ) + f(n-2, )FFF[n] =if (F[n] > 0) return F[n]

( n )return f(n 1, ) + f(n 2, )

}5

FFF[n]

f(4)3

f(3)2

f(5)Memoizationf(4)

2 1f(3)

0 1 2 3 4 5f(3)

f(2) f(1)11

f(2)

0 0 0 0 0 0Ff(2) f(1)1 0

1 2 3 5F[i] เกบ f(i)f(1) f(0) F[i] เกบ f(i)

แบบมกบไมม แบบมกบไมม memoimemoizzationation

ไมม memoization

ม memoization

เตมตารางอกแบบเตมตารางอกแบบ : Bottom: Bottom--UpUp0 1 2 3 4 50 0 0 0 0 0F 1 2 3 510

f( n ) {F = new array[0..n]F[0] = 0; F[1] = 1F[0] = 0; F[1] = 1for (i = 2; i <= n; i++) {

F[i] = F[i - 1] + F[i - 2]}return F[n]

}( n )

}

bottombottom--upupbottombottom--upup

ลดขนาดของตารางเหลอแค ลดขนาดของตารางเหลอแค 3 3 ตวตวf0 f1 f20 1 11 2

f( n ) {f0 = 0, f1 = 1, f2 = 1f0 0, f1 1, f2 1for (i = 2; i <= n; i++) {

f2 = f0 + f1f0 = f1f1 = f2

}}return f2

}

C(C(n,kn,k) : n ) : n เลอก เลอก kk

0if)1,1(),1( nkknCknC

otherwise0or0if1),( nkkknC

c(n, k) {if (k == 0 OR k == n) return 1

if (k < 0 OR k > n) return 0return c(n-1, k) + c(n-1, k-1)

}}c(4,2) Overlapping

c(3,2) c(3,1)Subproblems

c(2,2) c(2,1) c(2,1) c(2,0)

c(1,1) c(1,0) c(1,1) c(1,0)

C(n, k) : C(n, k) : เวลาการทางานเวลาการทางาน C(C(n,kn,k) : Top) : Top--down + down + MemoiMemoizzationationc(10,5)

c(n, k) {if (k == 0 OR k == n) return 1

ทา 503 ครง

if (k < 0 OR k > n) return 0return c(n-1, k) + c(n-1, k-1)

}}

c(10, 5, new array[1..10][1..5])ทา 51 ครงc(n, k, C[1..n][1..k]) {if (k == 0 OR k == n) return 1

( , , y[ ][ ])ทา 51 ครง

if (k == 0 OR k == n) return 1if (k < 0 OR k > n) return 0if (C[n][k] > 0) return C[n][k]return C[n][k] = c(n-1, k, C) + c(n-1, k-1, C)

}

แบบมกบไมม แบบมกบไมม memoimemoizzationation

ไมม memoization

ม memoization

C(n, k) : BottomC(n, k) : Bottom--upupPascal’s TrianglePascal s Triangle

Bottom = หาคาตอบของกรณเลก ๆUp = หาคาตอบของกรณใหญขน

โดยใชคาตอบของกรณเลกทรแลว

Pascal’s Triangle : Pascal’s Triangle : เขยนอกแบบเขยนอกแบบ

k0 1 2 3 4 5 6

0 1

k

0 11 1 12 1 2 12 1 2 13 1 3 3 1n4 1 4 6 4 15 1 5 10 10 5 16 1 6 15 20 15 6 1

C(6,2) = 15

C(n, k) : BottomC(n, k) : Bottom--upup

0if)1,1(),1( nkknCknC

otherwise0or0if1),( nkkknC

k0 1 2

0 11 1 1

n2 1 13 1

23 3

4 15 1

4 6 5 10

6 1 6 15

ตองการ C(6,2)

C(n, k) : BottomC(n, k) : Bottom--upupc(n, k) {

C = new array[0..n][0..k]for (i = 0; i <= n; i++) C[i][0] = 1for (i = 0; i <= k; i++) C[i][i] = 1for (i = 0; i <= k; i++) C[i][i] = 1for (i = 2; i <= n; i++)for (j = 1; j <= k && j < i; j++)

C[i][j] = C[i - 1][j] + C[i - 1][j - 1]return C[n][k];

} k} 0 1 201

11 1

n

123

23 3

1 11

11( nk )

456

4 6 5 106 15

1116 6 151

TopTop--Down vs. BottomDown vs. Bottom--UpUp Top-Downp

แบงปญหาใหญเปนปญหายอย หาคาตอบของปญหายอย หาคาตอบของปญหายอย นาคาตอบยอย ๆ มารวมเปนคาตอบของปญหาใหญ

i มกเขยนแบบ recursive แกปญหายอยเทาทจาเปน (แตอาจแกซา แกแลวแกอก)

ลดการแกปญหายอยซาดวย memoization

Bottom-Up Bottom Up เรมหาคาตอบของปญหาเลก ๆ นาคาตอบของปญหา ลกมาหาคาตอบของปญหาใหญขน นาคาตอบของปญหาเลกมาหาคาตอบของปญหาใหญขน มกเขยนแบบวงวน

แกปญหายอย ๆ ทกปญหา ปญหาละครง

Dynamic ProgrammingDynamic Programming ทางานแบบ bottom-up ดวยการแกปญหายอย p ญจาคาตอบทได เพอนาไปใชแกปญหาใหญขน

มกใชกบ optimization problems มกใชกบ optimization problems การหาเสนทางสนสด

การหาลาดบยอยรวมกนทยาวสด การเลอกของทไดมลคารวมสงสด การจดเกบขอมลในตนไมคนหาใหคนไดเรวสด การหาลาดบการคณเมทรกซ เพอใหคณไดเรวสด การหาลาดบการคณเมทรกซ เพอใหคณไดเรวสด…

Richard Bellman นกคณตศาสตรRichard Bellman นกคณตศาสตรผคดวธ Dynamic programming ในป ค.ศ. 1953

Longest Common SubsequenceLongest Common Subsequence

Longest Common SubsequenceLongest Common Subsequence X = <H, E, L, L, O> ม subsequences, , , , q

<H, E, L, L, O> <H, E> <H E L L O> <H E O> <H, E, L, L, O> <H, E, O> <H, E, L, L, O> <>…

Y = <H, E, R, O> ม subsequences <H, E, R, O> <H, E> <H E R O> <H R> <H, E, R, O> <H, R> <H, E, R, O> <H, E, O>…

common subsequence(X, Y) longest common subsequence(X, Y)

นยามนยาม

X = < x1, x2, x3, …, xm >X x1, x2, x3, …, xm

Y = < y1, y2, y3, …, yn >Xi = < x1, x2, …, xi >Yj = < y1, y2, …, yj >LCS(X Y ) :LCS(Xi , Yj) :

longest common subsequence ของ Xi , Yjj

LCS(X, Y) = LCS(Xm , Yn)L( ) LCS(X Y )L(i , j) : ความยาวของ LCS(Xi , Yj)

คาตอบใหญไดจากคาตอบยอย ๆคาตอบใหญไดจากคาตอบยอย ๆ

LCS( )

=

LCS( ) +LCS( ) +

LCS(HELLO, HERO) = LCS(HELL, HER) + OHE HE( , ) ( , )= HE + O= HEO= HEO

คาตอบใหญไดจากคาตอบยอย ๆคาตอบใหญไดจากคาตอบยอย ๆ

CS( )LCS( )

LCS(COP, CEO)

= =

LCS( ) LCS(COP CE)C CLCS( ) LCS(COP, CE)C C

LCS( ) LCS(CO, CEO)CO C OLCS( )

LCS(CO, CEO)CO C O

Recurrence Recurrence ของ ของ L(L(ii, j), j)xi

Xiyj

HELLOYj

yj

HERO

L(i j) = L(i 1 j 1) + 1 if x = yL(i, j) = L(i – 1, j – 1) + 1 if xi = yj

ความยาวของ LCS(Xi – 1 , Yj – 1) ตวขวาทเทากน 1 ตว

Recurrence Recurrence ของ ของ L(L(ii, j), j)xi

yj

Xi HELLyj

Yj HER

L(i j) = max( L(i 1 j) L(i j 1) ) if x ≠ yL(i, j) = max( L(i – 1, j) , L(i , j – 1) ) if xi ≠ yj

Xi Xi

Yj Yj

Recurrence Recurrence ของ ของ L(L(ii, j), j)

xiXi

yjYj

if1)11( yxjiL

if)1,(),,1(max

if1)1,1(),( yxjiLjiL

yxjiLjiL ji

ji

0or0 if0 ji

LCS : TopLCS : Top--downdown

if1)1,1( yxjiL ji

0or0if0if)1,(),,1(max

)(),(

jiyxjiLjiLyj

jiL ji

ji

0or0 if0 ji

L(x[1 m] y[1 n]) {L(x[1..m], y[1..n]) {return L(x, y, m, n)

}L(x[1..m], y[1..n], i, j) {

if (i == 0 OR j == 0) return 0if (x[i] == y[j]) {if (x[i] == y[j]) {return L(x, y, i-1, j-1) + 1

} else {return max( L(x, y, i-1, j),

L(x, y, i, j-1) )}}

}

หาความยาว หาความยาว LCS : LCS : เวลาการทางานเวลาการทางาน

worst case

ลกษณะขอมลของกรณ worst case และ best case เปนอยางไร ?กรณ best case มประสทธภาพเชงเวลาอยางไร ? ลองปรบดวย memoization จะไดผลอยางไร ?

LCS : best casesLCS : best cases

best case

worst case เมอสองลาดบไมเหมอนกนเลยbest case เมอสองลาดบเหมอนกนหมด

TopTop--down + down + MemoiMemoizzationation

if1)1,1( yxjiL ji

0or0if0if)1,(),,1(max

)(),(

jiyxjiLjiLyj

jiL ji

ji

0or0 if0 ji

L(x[1 m] y[1 n] i j M[1 m][1 n]) {L(x[1..m], y[1..n], i, j, M[1..m][1..n]) {if (i == 0 OR j == 0) return 0if (M[i][j] > 0) return M[i][j]if (x[i] == y[j]) {return M[i][j] = L(x, y, i-1, j-1, M) + 1

} else {} else {return M[i][j] = max( L(x, y, i-1, j, M),

L(x, y, i, j-1, M) )}

}

LCS : LCS : memoimemoizzationation

worst case

LCS : BottomLCS : Bottom--upup

if1)1,1( yxjiL ji

0or0if0if)1,(),,1(max

)(),(

jiyxjiLjiLyj

jiL ji

ji

0or0 if0 ji

jji H E L L O

0 0 0 0 0 00 0 0 0 0 0H 0 1 1 1 1 1E 0R 0

1 2 2 2 21 2 2 2 2

O 0 1 2 2 2 3

LCS : Dynamic LCS : Dynamic ProgProg..

if1)1,1( yxjiL ji

0or0if0if)1,(),,1(max

)(),(

jiyxjiLjiLyj

jiL ji

ji

0or0 if0 ji

LCS Length(x[1 m] y[1 n]) {LCS_Length(x[1..m], y[1..n]) {L = new array[0..m][0..n]for (i = 0; i <= m; i++) L[i][0] = 0for (j = 0; j <= n; j++) L[0][j] = 0for (i = 1; i <= m; i++)

for (j = 1; j <= n; j++) ( )for (j = 1; j <= n; j++)if (x[i] == y[j])

L[i][j] = L[i - 1][j - 1] + 1( nm )

elseL[i][j] = max(L[i - 1][j], L[i][j - 1])

return L;return L;}

ตองการ ตองการ LCS : LCS : จาผลการตดสนใจจาผลการตดสนใจ

if1)1,1( yxjiL ji

0or0if0if)1,(),,1(max

)(),(

jiyxjiLjiLyj

jiL ji

ji

0or0 if0 ji

jji H E L L O

0 0 0 0 0 00 0 0 0 0 0H 0 1 1 1 1 1E 0R 0

1 2 2 2 21 2 2 2 2

O 0 1 2 2 2 3

จาผลการตดสนใจจาผลการตดสนใจLCS(x[1..m], y[1..n]) {L = new array[0 m][0 n]L = new array[0..m][0..n]

for (i = 0; i <= m; i++) L[i][0] = 0D = new array[1..m][1..n]

for (j = 0; j <= n; j++) L[0][j] = 0for (i = 1; i <= m; i++)

for (j = 1; j <= n; j++)for (j = 1; j <= n; j++)if (x[i] == y[j])

L[i][j] = L[i - 1][j - 1] + 1else

L[i][j] = max(L[i - 1][j] L[i][j - 1]);if (L[i - 1][j] > L[i][j - 1])D[i][j] =

L[i][j] = max(L[i - 1][j], L[i][j - 1]);if (L[i - 1][j] > L[i][j - 1])L[i][j] = L[i - 1][j]D[i][j] =

elseL[i][j] = L[i][j - 1]D[i][j] = D[i][j] =

ใชผลการตดสนใจสรางคาตอบใชผลการตดสนใจสรางคาตอบlcs = an empty sequencei = n j = mi = n, j = mwhile (i > 0 AND j > 0) {

switch( D[i][j] ) {case :

lcs = x[i] + lcsi--; j-- j

i H E L L Oi--; j--case :

j--i H E L L O

case : i--

}HE}

}return lcs

ERO} O

ตองการประหยด ไมจาผลการตดสนใจตองการประหยด ไมจาผลการตดสนใจ

if1)1,1( yxjiL ji

0or0if0if)1,(),,1(max

)(),(

jiyxjiLjiLyj

jiL ji

ji

0or0 if0 ji

jji H E L L O

0 0 0 0 0 00 0 0 0 0 0H 0 1 1 1 1 1E 0 1 2 2 2 2R 0 1 2 2 2 2O 0 1 2 2 2 3

สราง สราง LCS LCS ไดจากตาราง ไดจากตาราง LL

if1)1,1( yxjiL ji

0or0if0if)1,(),,1(max

)(),(

jiyxjiLjiLyj

jiL ji

ji

0or0 if0 ji

jji H E L L O

0 0 0 0 0 00 0 0 0 0 0H 0 1 1 1 1 1E 0 1 2 2 2 2R 0 1 2 2 2 2O 0 1 2 2 2 3

สราง สราง LCS LCS ไดจากตาราง ไดจากตาราง LL

if1)1,1( yxjiL ji

0or0if0if)1,(),,1(max

)(),(

jiyxjiLjiLyj

jiL ji

ji

0or0 if0 ji

jji H E L L O

0 0 0 0 0 00 0 0 0 0 0H 0 1 1 1 1 1E 0 1 2 2 2 2R 0 1 2 2 2 2O 0 1 2 2 2 3

สราง สราง LCS LCS ไดจากตาราง ไดจากตาราง LL

if1)1,1( yxjiL ji

0or0if0if)1,(),,1(max

)(),(

jiyxjiLjiLyj

jiL ji

ji

0or0 if0 ji

jji H E L L O

0 0 0 0 0 00 0 0 0 0 0H 0 1 1 1 1 1E 0 1 2 2 2 2R 0 1 2 2 2 2O 0 1 2 2 2 3

สราง สราง LCS LCS ไดจากตาราง ไดจากตาราง LL

if1)1,1( yxjiL ji

0or0if0if)1,(),,1(max

)(),(

jiyxjiLjiLyj

jiL ji

ji

0or0 if0 ji

jji H E L L O

0 0 0 0 0 00 0 0 0 0 0H 0 1 1 1 1 1E 0 1 2 2 2 2R 0 1 2 2 2 2O 0 1 2 2 2 3

สราง สราง LCS LCS ไดจากตาราง ไดจากตาราง LL

if1)1,1( yxjiL ji

0or0if0if)1,(),,1(max

)(),(

jiyxjiLjiLyj

jiL ji

ji

0or0 if0 ji

jji H E L L O

0 0 0 0 0 00 0 0 0 0 0H 0 1 1 1 1 1E 0 1 2 2 2 2R 0 1 2 2 2 2O 0 1 2 2 2 3

สราง สราง LCS LCS ไดจากตาราง ไดจากตาราง LL

if1)1,1( yxjiL ji

0or0if0if)1,(),,1(max

)(),(

jiyxjiLjiLyj

jiL ji

ji

0or0 if0 ji

jji H E L L O

0 0 0 0 0 00 0 0 0 0 0H 0 1 1 1 1 1E 0 1 2 2 2 2R 0 1 2 2 2 2O 0 1 2 2 2 3

LCS_SolnLCS_Soln(x, y, L)(x, y, L)LCS_Soln(x[1..n], y[1..m], L[0..n][0..m]) {lcs = an empty sequencelcs = an empty sequencei = n, j = mwhile (i > 0 AND j > 0) {

if (x[i] == y[j]) {lcs = x[i] + lcsi ; ji--; j--

} else {if (L[i][j-1] > L[i-1][j])

j--else

ii--}

}return lcs

}สามารถหา LCS ไดดวยเนอท O(n + m )

D. Hirschberg “A linear space algorithm for computing maximal common subsequences”

Minimum Edit DistanceMinimum Edit Distance เปลยน HELLO ใหเปน HERO เชน

HELLO ELLO LLO LO RO ERO HERO HELLO HELO HERO HELLO HELO HERO

ใหการแกไขสตรงประกอบดวย

ลองทาเอง การลบอกขระหนงตว การเพมอกขระหนงตว

ลองทาเองคลาย ๆ LCS

การแทนอกขระหนงตวดวยอกขระอกตว

การแกไขมตนทน c c c การแกไขมตนทน cD , cI , cS

Edit distance คอตนทนการแกไขเพอเปลยนสตรง ปญหา : เปลยนสตรง s ใหเปน t อยางไรใหม

minimum edit distanceminimum edit distance

ลกษณะของปญหาลกษณะของปญหา overlapping subproblems :pp g p

ตองแกปญหายอย ๆ ซา ๆ หลายครง การจาคาตอบจงประหยดเวลาการทางานไดมากง ง

ตองมจานวนปญหายอยทงหมดไมมาก

optimal substructures ( i i l f ti lit ) : optimal substructures (principle of optimality) : คาตอบทดสดของปญหาใหญไดมาจาก

ป คาตอบทดสดของปญหาทเลกกวา ทาใหเขยน recurrence ของคณภาพของคาตอบได คด : ใชคาตอบดสดของปญหาเลกใด และเลอกอยางไร

if1)11( yxjiL

00if0

if)1,(),,1(maxif1)1,1(

),( yxjiLjiLyxjiL

jiL ji

ji

0or0 if0 ji

Optimal SubstructuresOptimal SubstructuresLCS("HELLO", "HERO") คอ LCS("HELL", "HER") ตอดวย "O"( , ) ( , )

1

2

1 46

7

ถาทางเดนสนสดจาก 1 ไป 7 คอ 1 2 4 6 7แสดงวาทางจาก 1 ไป 4 ซงคอ 1 2 4 ตองสนสดดวย

ทางจาก 1 ไป 6 ซงคอ 1 2 4 6 ตองสนสดดวยทางจาก 2 ไป 6 ซงคอ 2 4 6 ตองสนสดดวย

2 ไป 7 2 4 6 7 ทางจาก 2 ไป 7 ซงคอ 2 4 6 7 ตองสนสดดวย

ปญหา optimization ไมจาเปนตองมปญหา optimization ไมจาเปนตองม optimal substructure เสมอไป

Longest Simple PathLongest Simple PathSimple path คอ path ทไมผานปมซา

a b c d2 21

2 1a b c d ยาวสดแต a b ไมยาวสด

a b c d2 21

1

แต a b ไมยาวสด

2 1 a c b ยาวกวา

a b c d2 2112 1

a c b c d ยาวกวา แตไมใช simple pathไมม optimal substructure p pไมม optimal substructure

ใช dynamic programming ไมได

00//1 1 KnapsackKnapsack ของ n ชนมหมายเลข : 1, 2, 3, ..., n แตละชนหนก : w1, w2, w3, ..., wn

ตล ชนมมลคา แตละชนมมลคา : v1, v2, v3, ..., vn

ถงเปหนงใบจของไดหนกไมเกน W ปญหา : จงเลอกของใสถง เพอให

ถงไมขาด1.4Kg.

ถงไมขาด ไดมลคารวมมากสด

4K2.5Kg.

$50

4Kg.2.5Kg.$400

0.7Kg.$150

2.8Kg.$150 $350

00//1 1 KnapsackKnapsack ของ n ชนมหมายเลข : 1, 2, 3, ..., n แตละชนหนก : w1, w2, w3, ..., wn

ตล ชนมมลคา แตละชนมมลคา : v1, v2, v3, ..., vn

ถงเปหนงใบจของไดหนกไมเกน W หา <x1, x2, x3, ..., xn>, xk = 0 หรอ 1

n

kkkvx

1maximize

tosubject n

kk Wwxk 1

}1,0{1

k

kkk

x }1,0{kx

แบงปญหาใหญเปนปญหายอยแบงปญหาใหญเปนปญหายอย

232

11

5g฿5

2g

฿1

4g1g

฿2

42

11

42

11

23

ไมเลอก เลอก5g฿1

4g1g

฿23g

฿1

4g1g

฿2 ฿5

2gไมเลอกชนท 3

เลอกชนท 3

51g1

31g1

2g3

11g1

4g2

5g1g

฿23g1g

฿2 ฿5

2g1g1g

฿2 ฿1

4g

5g4 1g

11g 4g

2

1 4g2

1g1

3g 2g3

1g1

2g3

5g4g 1g

฿2

g฿1

1g฿1

4g 1g

฿2

3g฿5 2g 1g

฿2 ฿5

2g

หาคาตอบใหญจากคาตอบเลกหาคาตอบใหญจากคาตอบเลก321

42

1g1฿2

5g฿5

2g

฿1

4g1g

฿2

1g฿1

4g1g

฿2

21฿7

2g4g2

1g

฿2

1฿2max( ,฿5 + )฿2฿3

฿1฿2

42

1g1฿2

( )

3g฿1

4g1g

฿2เลอกชนท 3

4g4g2

1g

฿2

1฿2

฿1฿2

42

1g1฿3

5g฿1

4g1g

฿2ไมเลอกชนท 3

ปญหาใหญ ปญหาใหญ : : ปญหายอยปญหายอย LCS : L(i, j)( j)

ปญหาใหญหรอเลกขนกบความยาวของลาดบ Xi และ Yj

Edit distance : D(i j) Edit distance : D(i, j) Knapsack : V( ? )

ปญหาใหญหรอเลกขนกบจานวนของ และนาหนกทถงรบได

V(i j) : มลคารวมสงสดในการV(i, j) : มลคารวมสงสดในการ เลอกของชนท 1, 2, 3, ..., iใ ป ไ ไ j ใสถงเปทรบนาหนกไดไมเกน j

V(i j)เขยน recurrence ของ V(i, j)

เขยนเขยน recurrence V(recurrence V(ii, j), j)321 V(3, 5) = max( , )

5g฿5

2g

฿1

4g1g

฿2V(3-1 5) V(3-1 5-w )v +

42

11

42

11

ไมเลอก เลอก

V(3-1, 5) V(3 1, 5 w3)v3 +

5g฿1

4g1g

฿23g

฿1

4g1g

฿2

ไมเลอกชนท 3

เลอกชนท 3

V(i, j) แทนมลคาของการเลอกทดสดเมอ มของใหเลอกชนท 1, 2, ..., i ใสถงเปทจไดหนก j

d0if)1()1( VV

if),1(

and0if),1(),,1(max),( wjjiV

wjiwjiVvjiVjiV i

iii

0or0if0

),(),(ji

jjj i

Knapsack : TopKnapsack : Top--downdown

and0if),1(),,1(max wjiwjiVvjiV iii

0or0if0if),1(),(

jiwjjiVjiV i

V( v[1..n], w[1..n], W ) {

0or0if0 ji

V( v[1..n], w[1..n], W ) {return V(v, w, n, W)

}V( v[1..n], w[1..n], i, j ) {

if (i == 0 OR j == 0) return 0if (j < w[i]) {if (j < w[i]) {return V(v, w, i-1, j)

} else {return max( V(v, w, i-1, j),

V(v, w, i-1, j-w[i]) + v[i] )}}

}

TopTop--down + down + MemoiMemoizzationation

and0if),1(),,1(max wjiwjiVvjiV iii

0or0if0if),1(),(

jiwjjiVjiV i

V(v[1..n], w[1..n], i, j, M[1..n][1..W]) {

0or0if0 ji

V(v[1..n], w[1..n], i, j, M[1..n][1..W]) {if (i == 0 || j == 0) return 0if (M[i][j] > 0) return M[i][j]if (j < w[i]) {

return M[i][j] = V(v, w, i-1, j)} else {} else {

return M[i][j] = max( V(v, w, i-1, j), V(v, w, i-1, j-w[i]) )

}}

00//1 1 Knapsack : BottomKnapsack : Bottom--UpUp

and0if),1(),,1(max wjiwjiVvjiV iii

0or0if0if),1(),(

jiwjjiVjiV i

0or0if0 ji

j 0 1 2 3 4 5 6 7 8 9 10ji 0 1 2 3 4 5 6 7 8 9 10

vi wi 0 0 0 0 0 0 0 0 0 0 0 0

20 2 1 0

30 2 2 0

66 3 3 0

0 20 20 20 20 20 20 20 20 20

0

0 30 30 50 50 50 50 50 50 50

30 66 66 96 96 116 116 116 11666 3 3 0

40 4 4 0

60 5 5 0

0 30 66 66 96 96 116 116 116 116

0 30 66 66 96 96 116 116 136 136

0 30 66 66 96 96 116 126 136 156

W = 10

60 5 5 0 0 30 66 66 96 96 116 126 136 156

00//1 1 Knapsack : BottomKnapsack : Bottom--UpUpknapsack_Value(v[1..n], w[1..n], W) {V = new array[0 n][0 W]V = new array[0..n][0..W]for (i = 0; i <= n; i++) V[i][0] = 0for (j = 0; j <= W; j++) V[0][j] = 0for (i = 1; i <= n; i++)

for (j = 1; j <= W; j++)if (j < w[i]) ( nW )if (j < w[i])

V[i][j] = V[i-1][j]else

( nW )

V[i][j] = max(V[i-1][j]), v[i]+V[i-1][j-w[i]])return V

}}

and0if),1(),,1(max wjiwjiVvjiV iii

0or0if0if),1(

a d0),(),,(a),(

jiwjjiV

wjiwjiVvjiVjiV i

iii

0or0if0 ji

อยากรเลอกอะไร อยากรเลอกอะไร : : จาผลการตดสนใจจาผลการตดสนใจ

and0if),1(),,1(max wjiwjiVvjiV iii

0or0if0if),1(),(

jiwjjiVjiV i

0or0if0 ji

ji 0 1 2 3 4 5i

vi wi 0 0 0 0 0 0 0

20 2 1 0 0 20 20 20 20 0 0

30 2 2 0

25 3 3 0

0 20 20 20 20

0

0 30 30 50 50

30 30 50 55

W = 5

ใชผลการตดสนใจสรางคาตอบใชผลการตดสนใจสรางคาตอบ

ji 0 1 2 3 4 5i

vi wi 0 0 0 0 0 0 0

20 2 1 0 0 0

30 2 2 0

25 3 3 0

00//1 1 Knapsack : Knapsack : จาการตดสนใจจาการตดสนใจknapsack(v[1..n], w[1..n], W) {V = new array[0 n][0 W]V = new array[0..n][0..W]X = new array[1..n][1..W]for (i = 0; i <= n; i++) V[i][0] = 0for (j = 0; j <= W; j++) V[0][j] = 0for (i = 1; i <= n; i++)

for (j = 1; j <= W; j++)for (j = 1; j <= W; j++)if (j < w[i])

V[i][j] = V[i-1][j]; X[i][j] = j j jelse

if ( V[i-1][j]) > v[i]+V[i-1][j - w[i]] ) {V[i][j] = V[i 1][j])V[i][j] = V[i-1][j])X[i][j] =

} else {V[i][j] = v[i] + V[i-1][j – w[j]]X[i][j] =

}}

00//1 1 Knapsack : Knapsack : จาการตดสนใจจาการตดสนใจ S = an empty seti = n; j = Wi = n; j = Wwhile (i > 0 AND j > 0) {

if ( X[i][j] == ) {jS.add(i);j = j - w[i];

}j

i 0 1 2 3 4 5

}i--

}vi wi 0 0 0 0 0 0 0

20 2 1 0

30 2 2 0

return S;}

30 2 2 0

25 3 3 0

ตองการประหยด ไมจาผลการตดสนใจตองการประหยด ไมจาผลการตดสนใจ

and0if),1(),,1(max wjiwjiVvjiV iii

0or0if0if),1(),(

jiwjjiVjiV i

j

ji 0 1 2 3 4 5 6 7 8 9 10i

vi wi 0 0 0 0 0 0 0 0 0 0 0 0

20 2 1 0 0 20 20 20 20 20 20 20 20 2020 2 1 0 0 20 20 20 20 20 20 20 20 20

30 2 2 0 0 30 30 50 50 50 50 50 50 50

66 3 3 0 0 30 66 66 96 96 116 116 116 11666 3 3 0 0 30 66 66 96 96 116 116 116 116

40 4 4 0 0 30 66 66 96 96 116 116 136 136

60 5 5 0 0 30 66 66 96 96 116 126 136 156

i = 0 or j = 0 ? falsej < w ? falsej < wi ? falseV(i , j) = vi + V(i–1, j–wi) ? true เลอกชนท 5

แลวเลอกของชนใดบาง แลวเลอกของชนใดบาง ??

and0if),1(),,1(max wjiwjiVvjiV iii

0or0if0if),1(),(

jiwjjiVjiV i

ji 0 1 2 3 4 5 6 7 8 9 10

j

i

vi wi 0 0 0 0 0 0 0 0 0 0 0 0

20 2 1 0 0 20 20 20 20 20 20 20 20 2020 2 1 0 0 20 20 20 20 20 20 20 20 20

30 2 2 0 0 30 30 50 50 50 50 50 50 50

66 3 3 0 0 30 66 66 96 96 116 116 116 11666 3 3 0 0 30 66 66 96 96 116 116 116 116

40 4 4 0 0 30 66 66 96 96 116 116 136 136

60 5 5 0 0 30 66 66 96 96 116 126 136 156

i = 0 or j = 0 ? falsej < w ? falsej < wi ? falseV(i , j) = vi + V(i–1, j–wi) ? false

แลวเลอกของชนใดบาง แลวเลอกของชนใดบาง ??

and0if),1(),,1(max wjiwjiVvjiV iii

0or0if0if),1(),(

jiwjjiVjiV i

ji 0 1 2 3 4 5 6 7 8 9 10

j

i

vi wi 0 0 0 0 0 0 0 0 0 0 0 0

20 2 1 0 0 20 20 20 20 20 20 20 20 2020 2 1 0 0 20 20 20 20 20 20 20 20 20

30 2 2 0 0 30 30 50 50 50 50 50 50 50

66 3 3 0 0 30 66 66 96 96 116 116 116 11666 3 3 0 0 30 66 66 96 96 116 116 116 116

40 4 4 0 0 30 66 66 96 96 116 116 136 136

60 5 5 0 0 30 66 66 96 96 116 126 136 156

i = 0 or j = 0 ? falsej < w ? falsej < wi ? falseV(i , j) = vi + V(i–1, j–wi) ? true เลอกชนท 3

แลวเลอกของชนใดบาง แลวเลอกของชนใดบาง ??

and0if),1(),,1(max wjiwjiVvjiV iii

0or0if0if),1(),(

jiwjjiVjiV i

ji 0 1 2 3 4 5 6 7 8 9 10

j

i

vi wi 0 0 0 0 0 0 0 0 0 0 0 0

20 2 1 0 0 20 20 20 20 20 20 20 20 2020 2 1 0 0 20 20 20 20 20 20 20 20 20

30 2 2 0 0 30 30 50 50 50 50 50 50 50

66 3 3 0 0 30 66 66 96 96 116 116 116 11666 3 3 0 0 30 66 66 96 96 116 116 116 116

40 4 4 0 0 30 66 66 96 96 116 116 136 136

60 5 5 0 0 30 66 66 96 96 116 126 136 156

i = 0 or j = 0 ? falsej < w ? falsej < wi ? falseV(i , j) = vi + V(i–1, j–wi) ? true เลอกชนท 2

แลวเลอกของชนใดบาง แลวเลอกของชนใดบาง ??

and0if),1(),,1(max wjiwjiVvjiV iii

0or0if0if),1(),(

jiwjjiVjiV i

ji 0 1 2 3 4 5 6 7 8 9 10

j

i

vi wi 0 0 0 0 0 0 0 0 0 0 0 0

20 2 1 0 0 20 20 20 20 20 20 20 20 2020 2 1 0 0 20 20 20 20 20 20 20 20 20

30 2 2 0 0 30 30 50 50 50 50 50 50 50

66 3 3 0 0 30 66 66 96 96 116 116 116 11666 3 3 0 0 30 66 66 96 96 116 116 116 116

40 4 4 0 0 30 66 66 96 96 116 116 136 136

60 5 5 0 0 30 66 66 96 96 116 126 136 156

i = 0 or j = 0 ? true

knapsack_Solnknapsack_Soln(v, w, V)(v, w, V)knapsack Soln( v[1..n], w[1..n], V[0..n][0..W] ) {p _ ( [ ], [ ], [ ][ ] ) {S = an empty seti = n; j = Whil (i > 0 AND j > 0) {while (i > 0 AND j > 0) {if (j >= w[i] AND

V[i][j] == v[i] + V[i-1][j - w[i]]) {[ ][j] [ ] [ ][j [ ]]) {S.add(i);j = j - w[i];

}}i--

}}return S;

}

ทอนเงนทอนเงน มเหรยญอย n แบบ : 1, 2, 3, ..., n แตละแบบมคา : v1, v2, v3, ..., vn

ตองการทอนเงนใหลกคามลคา V ตองการทอนเงนใหลกคามลคา V โดยใชเหรยญเปนจานวนนอยสดญ

(มเหรยญแตละแบบจานวนไมจากด)

ตวอยาง ตวอยาง มเหรยญ : 1, 3, 4, 10 ตองการทอนเงนมลคา 6 คาตอบ : 3, 3

ลองทาเองลองทาเองคลาย ๆ Knapsack

Longest Increasing SubsequenceLongest Increasing Subsequence กาหนดให

A คอลาดบของจานวน < a1, a2, ..., an >

จงหา จงหา subsequence ทยาวสดของ A ทมคาเรยงจากนอยไปมาก

ตวอยาง A = <31, -41, 59, 26, -53, 58, 97, -93, -23, 84>, , , , , , , , , คาตอบคอ < -41, 26, 58, 97 >

ลองทาด

MatrixMatrix--Chain MultiplicationChain Multiplication

A1A2A3A4

(A1(A2(A3A4)))(A ((A A )A ))

วงเลบกาหนดลาดบการคณ

ใ (A1((A2A3)A4))((A1A2)(A3A4))

ลาดบการคณตางกนใช เวลาคณตางกน

(((A1A2)A3)A4)((A (A A ))A )

จงหาวธการใสวงเลบใช ส((A1(A2A3))A4) ทใชเวลาการคณเรวสด

Matrix MultiplicationMatrix Multiplication

C = A B ตองคณดวย *C A B[p r] [p q] [q r]

ตองคณดวย จานวน pqr ครง

mult(A[1..p][1..q], B[1..q][1..r]) {create C[1..p][1..r]f (i 1 i < i++) {for (i = 1; i <= p; i++) {

for (j = 1; j <= r; j++) {C[i][j] = 0[ ][j]for (k = 1; k <= q; k++) {

C[i][j] += A[i][k] * B[k][j];}}

}}

q

bac}return C;

}

k

jkkiji bac1

,,,

ลาดบการคณตางกน ใชเวลาตางกนลาดบการคณตางกน ใชเวลาตางกน A1 A2 A3

1 2 3[10 x 100], [100 x 5], [5 x 50]

คณตามลาดบ ((A1A2)A3) คณตามลาดบ ((A1A2)A3) (A1A2) ตองคณดวย * จานวน 10 x 100 x 5 = 5,000 ครงไ ซ A [10 5] ไดเมทรกซ A12 ขนาด [10 x 5]

(A12 A3) ตองคณดวย * จานวน 10 x 5 x 50 = 2,500 ครง รวมเปน = 7,500 ครง

คณตามลาดบ (A1(A2A3)) คณตามลาดบ (A1(A2A3)) (A2A3) ตองคณดวย * จานวน 100 x 5 x 50 = 25,000 ครง ได มทรกซ A ขนาด [100 50] ไดเมทรกซ A23 ขนาด [100 x 50] (A1A23) ตองคณดวย * จานวน 10 x 100 x 50 = 50,000 ครง

รวมเปน = 75,000 ครง

ใสวงเลบไดกรปแบบใสวงเลบไดกรปแบบA1 A2 A3 A4 A5(A1)(A2 A3 A4 A5)(A A )(A A A )

1 5

1 2(A1 A2)(A3 A4 A5)(A1 A2 A3)(A4 A5)

1 2

2 1

(A1 A2 A3 A4)(A5)C( ) คอจานวนการใสวงเลบกรณม ตว

5 1

(A1 ... Ak)(Ak+1 ... An)C(n) คอจานวนการใสวงเลบกรณม n ตว

1 k k+1 n

C(k) C(n – k)

C(n) = C(k) C(n – k)

( ) ( )

1n

( ) ( ) ( ) 1k

ใสวงเลบไดกรปแบบใสวงเลบไดกรปแบบ

3)()(1

nknCkCn

21

3)()()(1

n

nknCkCnCk 21 n

C(n)

2/3

4n

n

C

n

ชามาก ๆ ถาตองลองทกรปแบบ

นยามนยาม ตองการหาวธใสวงเลบของ A1 A2 ... An1 2 n

A1 มขนาด p0 x p1

A A2 มขนาด p1 x p2...

An มขนาด pn-1 x pn

A A มขนาด p x p Ai ... Aj มขนาด pi-1 x pj

ยงไมหาวธการใสวงเลบทดสด ขอหาจานวนการคณดวย * ของการใสวงเลบทดสด m(i j) =จานวน * นอยสดเพอหาผลคณ A A m(i, j) =จานวน * นอยสดเพอหาผลคณ Ai ... Aj

m(1, n) คอคาตอบทตองการ

จานวนการคณจานวนการคณm(i, j) คอจานวนการคณดวย * นอยสดของการคณ Ai Ai+1...Aj

คณ Ai ... Ak ใช m(i, k) ไดเมทรกซขนาด [ pi–1 pk ]คณ A A ใช (k+1 j) ได มทรกซขนาด [ ]คณ Ak+1 ... Aj ใช m(k+1, j) ไดเมทรกซขนาด [ pk pj ]

คณเมทรกซทงสองใช pi–1 pk pj

[ pi 1 pk ] [ pk pj ]

pi 1 pk pj

(Ai ... Ak)(Ak+1 ... Aj)[ pi–1 pk ] [ pk pj ]

m(i, k) m(k+1, j)+ + pi–1 pk pjจานวนการคณดวย * นอยสด เมอแบงท k

จานวนการคณนอยสดจานวนการคณนอยสด m(i, j) คอจานวนการคณดวย * นอยสดของการคณ Ai Ai+1...Aj

(Ai ... Ak)(Ak+1 ... Aj)m(i, k) m(k+1, j)+ + pi–1 pk pj

m(1,1) + m(2,5) + p0 p1 p5m(1 2) + m(3 5) + p p p

(A1)(A2 A3 A4 A5)(A A )(A A A ) m(1,2) + m(3,5) + p0 p2 p5

m(1,3) + m(4,5) + p0 p3 p5

(A1 A2)(A3 A4 A5)(A1 A2 A3)(A4 A5)

m(1,4) + m(5,5) + p0 p4 p5(A1 A2 A3 A4)(A5)

ji

jipppjkmkimjim jkijki

if0

if),1(),(min),( 1

1 jiif0

MCM : TopMCM : Top--downdown jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

mcm( p[0..n], i, j ) {if (i j) t 0if (i == j) return 0;

minMCM = ;;for( k = i; k <= j-1; k++ ) {

minMCM = min( minMCM,( i k) +mcm(p, i, k) +

mcm(p, k+1, j) +p[i-1]*p[k]*p[j] );p[ ] p[ ] p[j] );

}return minMCM;

}}

TopTop--down + down + MemoiMemoizzationation jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

mcm( p[0..n], i, j ) {if (i j) t 0

, M[1..n][1..n] ) {if (i == j) return 0;

minMCM = ;if (M[i][j] > 0) return M[i][j]M[i][j] = ;for( k = i; k <= j-1; k++ ) {

minMCM = min( minMCM,( i k) +

[ ][j]M[i][j] M[i][j],

M) +mcm(p, i, k) + mcm(p, k+1, j) +p[i-1]*p[k]*p[j] );

, M) +, M) +

p[ ] p[ ] p[j] );}return minMCM;

}M[i][j]

}

MCM : BottomMCM : Bottom--UpUp jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

jji 1 2 3 4 5123

m(2,5)m(2,2)

m(3 5)

m(2,3)m(2,4)

34

m(3,5)

m(4,5)

5 m(5,5)

คาตอบใหญไดจากคาตอบยอยคาตอบใหญไดจากคาตอบยอย jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

jji 1 2 3 4 51 m(1,5)m(2,2)m(2,3)m(2,4)m(1,1)

23 m(3 5)

m(2,5)

34

m(3,5)

m(4,5)

5 m(5,5)

เตมตารางไดหลายรปแบบเตมตารางไดหลายรปแบบเตมคาตอบเลกกอนคาตอบใหญ

รปแบบการเตมตารางคาตอบรปแบบการเตมตารางคาตอบ jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

for( i = 1; i <= n; i++ )( )m[i][i] = 0

for( j = 2; j <= n; j++ ) {f ( i j 1 i > 1 i ) {for ( i = j-1; i >= 1; i-- ) {

m[i][j] = ...}}

}

รปแบบการเตมตารางคาตอบรปแบบการเตมตารางคาตอบ jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

for( i = 1; i <= n; i++ )( )m[i][i] = 0

for( i = n-1; i >= 1; i-- ) {f ( j i+1 j < j++ ) {for ( j = i+1; j <= n; j++ ) {

m[i][j] = ...}}

}

รปแบบการเตมตารางคาตอบรปแบบการเตมตารางคาตอบ jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

ตวอยางตวอยาง jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

A1 A2 A3 A4 A510 × 5 × 1 × 5 × 10 × 210 × 5 × 1 × 5 × 10 × 2

ji 1 2 3 4 5i 1 2 3 4 51 0 50

23

0

0

25

50345

0

0

100

5 0

ตวอยางตวอยาง jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

A1 A2 A3 A4 A510 × 5 × 1 × 5 × 10 × 210 × 5 × 1 × 5 × 10 × 2

ji 1 2 3 4 5i 1 2 3 4 51 0 50 0 + 25 + 10x5x5 = 275 100

2 0 25

3 0 50

50 + 0 + 10x1x5 = 100

34 0 100

5 05 0

ตวอยางตวอยาง jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

A1 A2 A3 A4 A510 × 5 × 1 × 5 × 10 × 210 × 5 × 1 × 5 × 10 × 2

ji 1 2 3 4 5i 1 2 3 4 51 0 50 100 0 + 50 + 5x1x10 = 100

2 0 25

3 0 50

25 + 0 + 5x5x10 = 275 100

34 0 100

5 05 0

ตวอยางตวอยาง jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

A1 A2 A3 A4 A510 × 5 × 1 × 5 × 10 × 210 × 5 × 1 × 5 × 10 × 2

ji 1 2 3 4 5i 1 2 3 4 51 0 50 100 0 + 100 + 1x5x2 = 110

2 0 25 100

3 0 50

50 + 0 + 1x10x2 = 70

7034 0 100

5 05 0

ตวอยางตวอยาง jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

A1 A2 A3 A4 A510 × 5 × 1 × 5 × 10 × 210 × 5 × 1 × 5 × 10 × 2

ji 1 2 3 4 5i 1 2 3 4 51 0 50 100 0 + 100 + 10x5x10 = 600 200

2 0 25 100

3 0 50 70

50 + 50 + 10x1x10 = 200

100 + 0 + 10x5x10 = 60034 0 100

5 0

100 + 0 + 10x5x10 600

5 0

ตวอยางตวอยาง jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

A1 A2 A3 A4 A510 × 5 × 1 × 5 × 10 × 210 × 5 × 1 × 5 × 10 × 2

ji 1 2 3 4 5i 1 2 3 4 51 0 50 100 200 0 + 70 + 5x1x2 = 80

2 0 25 100

3 0 50 70

25 + 100 + 5x5x2 = 175 80

100 + 0 + 5x10x2 = 20034 0 100

5 0

100 + 0 + 5x10x2 200

5 0

ตวอยางตวอยาง jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

A1 A2 A3 A4 A510 × 5 × 1 × 5 × 10 × 210 × 5 × 1 × 5 × 10 × 2

ji 1 2 3 4 5i 1 2 3 4 51 0 50 100 200 0 + 80 + 10x5x2 = 180 140

2 0 25 100 80

3 0 50 70

50 + 70 + 10x1x2 = 140

100 + 100 + 10x5x2 = 30034 0 100

5 0

100 + 100 + 10x5x2 300

200 + 0 + 10x10x2 = 400

5 0

วงวนการเตมตารางคาตอบวงวนการเตมตารางคาตอบ jipppjkmkim jki if),1(),(min 1

ji

jpppjjim jkijki

if0

),(),(),( 1

1

for( i = 1; i <= n; i++) M[i][i]=0for( d = 1; d < n; d++ ) { 1,1 1,2 1,3 1,4 1,5for( d = 1; d < n; d++ ) {for ( i = 1; i <= n-d; i++ ) {

j = i + d; 2,2 2,3 2,4 2,5

for ( k = i; k < j; k++ ) {M[i][j] = ...

} d = 1 d = 2 d = 3 d = 43,3

4 4

3,4

4 5

3,5

}}

}d = 1i, j1, 2

d = 2i, j1, 3

d = 3i, j1, 4

d = 4i, j1, 5

4,4

5,5

4,5

1, 22, 33, 4

1, 32, 43, 5

1, 42, 5

1, 5

4, 5

MCM : BottomMCM : Bottom--upup

jipppjkmkim

jim jkijkiif),1(),(min

)( 11

mcm Value( p[0 n] ) {

jijim j

if0),(

mcm_Value( p[0..n] ) {M = new array[1..n][1..n]for( i = 1; i <= n; i++ ) M[i][i] = 0for( d = 1; d < n; d++ ) {

for ( i = 1; i <= n-d; i++ ) {j = i + d;j = i + d;M[i][j] = for ( k = i; k < j; k++ ) {

M[i][j] = min( M[i][j], M[i][k] + M[k+1][j] + p[i-1]*p[k]*p[j]);

}}}

} ( n3 )return M;

}

จาจดแบง จาจดแบง k k ทไดคานอยสดทไดคานอยสด j

i 1 2 3 4 5i 1 2 3 4 51 0 50 100 200 140

2 0 25 100 80

1

2

1

2 2

22

2 0 25 100 80

3 0 50 70

2

3

2

4

2

4 0 100

5 0

4

5

(A A )(A A )

(Ai ... Ak)(Ak+1 ... Aj)

ji

jipppjkmkimjim jkijki

if0

if),1(),(min),( 1

1 jiif0

การใสวงเลบทคณเรวสดการใสวงเลบทคณเรวสด j

i 1 2 3 4 5i 1 2 3 4 51 0 50 100 200 140

2 0 25 100 80

1

2

1

2 2

22

2 0 25 100 80

3 0 50 70

2

3

2

4

2

4 0 100

5 0

4

5

[1,5] 2 ( A1 A2 )( A3 A4 A5 )((A1)(A2))( A3 A4 A5 )[1,2] 1 (( 1)( 2))( 3 4 5 )[1,2] 1((A1)(A2))(( A3 A4 )(A5))[3,5] 4

((A1)(A2))(((A3)(A4))(A5))[3,4] 3

จาจดแบง จาจดแบง matrix chainmatrix chainmcm_Value( p[0..n] ) {M = new Array[1 n][1 n]

mcm_OrderM = new Array[1..n][1..n]for( d = 1; d < n; d++ ) {K = new Array[1..n][1..n]

for ( i = 1; i <= n-d; i++ ) {j = i + d;M[i][j] = M[i][j] = for ( k = i; k < j; k++ ) {

t = M[i][k] + M[k+1][j] + p[i-1]*p[k]*p[j];if (t < M[i][j]) {M[i][j] = t;K[i][j] k

}}

K[i][j] = k;

( )( )}}return M;return K;

(Ai ... Ak)(Ak+1 ... Aj)return M;

}return K;

MCM : MCM : คณเลยคณเลยmcm_Mult( A[1..n], p[0..n] ) { ( n3 )K = mcm_Order( p );return mcm_Mult( A, K, 1, n );

}

( n )

( ? )}

mcm Mult( A[1..n], K[1..n][1..n], i, j ) {( ? )

_ jif (i == j) return A[i];X = mcm_Mult( A, K, i, K[i][j] );Y = mcm Mult( A K K[i][j]+1 j );Y = mcm_Mult( A, K, K[i][j]+1, j );return mult(X, Y);

}

(Ai ... Ak)(Ak+1 ... Aj)( i k)( k+1 j)X Y

top related