dip idynamic programming f( n ) { if (n < 2) return n 2 f...
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