ph¡p quy ho¤ch ëng
º c i °t mët ch÷ìng tr¼nh sû döng quy ho¤ch ëng c¦n thüc hi»n c¡c b÷îc sau:
B÷îc 1: Gi£i t§t c£ c¡c b i to¡n cì sð (thæng th÷íng r§t d¹), l÷u c¡c líi gi£i v o b£ng ph÷ìng ¡n.
B÷îc 2: Dòng cæng thùc truy hçi phèi hñp nhúng líi gi£i cõa nhúng b i to¡n nhä ¢ l÷u trong b£ng ph÷ìng ¡n º t¼m líi gi£i cõa nhúng b i to¡n lîn hìn v l÷u chóng v o b£ng ph÷ìng ¡n. Cho tîi khi b i to¡n ban ¦u t¼m ÷ñc líi gi£i.
B÷îc 3: Düa v o b£ng ph÷ìng ¡n, truy v¸t t¼m ra nghi»m tèi ÷u. Cho ¸n nay, v¨n ch÷a bi¸t mët c¡ch ch½nh x¡c nhúng b i to¡n n o câ thº gi£i hi»u qu£ b¬ng quy ho¤ch ëng. Tuy nhi¶n º bi¸t ÷ñc b i to¡n câ thº gi£i b¬ng quy ho¤ch ëng hay khæng, ta câ thº tü °t c¥u häi: "Mët nghi»m tèi ÷u cõa b i to¡n lîn câ ph£i l sü phèi hñp c¡c nghi»m tèi ÷u cõa c¡c b i to¡n con hay khæng ?" v Li»u câ thº n o l÷u trú ÷ñc nghi»m c¡c b i to¡n con d÷îi mët h¼nh thùc n o â º phèi hñp t¼m ÷ñc nghi»m b i to¡n lîn".
Ch֓ng 2
MËT SÈ BI TON QUY HOCH ËNG
2.1 D¢y con ìn i»u t«ng d i nh§t
B i to¡n: Cho d¢y sè nguy¶nC = c[1..m].(m ≤ 5000,−10000 ≤c[k] ≤
10000). Mët d¢y con cõa C l mët c¡ch chån ra trong C mët sè ph¦n tû giú nguy¶n thù tü. Nh÷ vªy C câ 2m d¢y con.
Y¶u c¦u: T¼m d¢y con ìn i»u t«ng cõa C câ ë d i lîn nh§t.
V½ dö 2.1. C = (1, 2, 3, 4, 9, 11, 7, 5, 12, 6). D¢y con ìn i»u t«ng d i nh§t l : (1, 2, 3, 4, 9, 11, 12).
Input: file v«n b£n QU Y.IN P ∗ Dáng 1: Chùa sè m.
∗ Chùa m sè c[1], c[2], . . . , c[m] c¡ch nhau ½t nh§t mët d§u c¡ch. Output: file v«n b£n QU Y.OU T
∗ C¡c dáng ti¸p: Ghi d¢y con t¼m ÷ñc v ch¿ sè nhúng ph¦n tû ÷ñc chån v o d¢y con â.
H¼nh 2.1:
C¡ch gi£i:
Bê sung v o C hai ph¦n tû: c[0] = −∞ v c[m+ 1] = +∞. Khi â d¢y con ìn i»u t«ng d i nh§t chc chn s³ bt ¦u tø c[0] v k¸t thóc ð
c[m+ 1].
Vîi ∀j : 0 ≤ j ≤ m + 1. Ta s³ t½nh L[j] = ë d i d¢y con ìn i»u t«ng d i nh§t bt ¦u t¤i a[j].
Cì sð quy ho¤ch ëng (b i to¡n nhä nh§t): L[m+ 1] = ë d i d¢y con ìn i»u t«ng d i nh§t bt ¦u t¤i c[m+ 1] = +∞. D¢y con n y ch¿ gçm méi mët ph¦n tû (+∞) n¶n L[m+ 1] = 1.
Cæng thùc truy hçi: Gi£ sû vîi j ch¤y tø m v· 0, ta c¦n t½nh L[j]: ë d i d¢y con t«ng d i nh§t bt ¦u t¤i a[j]. L[j] ÷ñc t½nh trong i·u ki»n L[j+ 1..m+ 1] ¢ bi¸t:
D¢y con ìn i»u t«ng d i nh§t bt ¦u tø c[j] s³ ÷ñc th nh lªp b¬ng c¡ch l§y c[j] gh²p v o ¦u mët trong sè nhúng d¢y con ìn i»u t«ng d i nh§t bt ¦u t¤i và tr½ c[k] ùng sau c[j]. Ta s³ chån d¢y n o º gh²p c[j] v o ¦u? T§t nhi¶n l ch¿ ÷ñc gh²p c[j] v o ¦u nhúng d¢y con bt ¦u t¤i c[k] n o â lîn hìn c[j] (º £m b£o t½nh t«ng)
v d¾ nhi¶n ta s³ chån d¢y d i nh§t º gh²p c[j] v o ¦u (º £m b£o t½nh d i nh§t). Vªy L[j] ÷ñc t½nh nh÷ sau: X²t t§t c£ c¡c ch¿ sè j trong kho£ng tø j + 1 ¸n m+ 1 m c[k] > c[j], chån ra ch¿ sè kmax
câ L[kmax] lîn nh§t. °t L[j] := L[kmax] + 1 :.
L[j] = max
j<k≤m−1
c[j]<c[k]
L[k] + 1
. Truy v¸t: T¤i b÷îc x¥y düng d¢y L, méi khi g¡n L[j] := L[kmax] + 1, ta °t T[j] = kmax. º l÷u l¤i r¬ng: D¢y con d i nh§t bt ¦u t¤i
c[j] s³ câ ph¦n tû thù hai k¸ ti¸p l c[kmax].
Sau khi t½nh xong hay d¢y L v T, ta bt ¦u tø T[0].
H¼nh 2.2: T½nh to¡n v truy v¸t
. T[0] ch½nh l ph¦n tû ¦u ti¶n ÷ñc chån
. T[T[0]] l ph¦n tû thù hai ÷ñc chån
. T[T[T[0]]] l ph¦n tû thù ba ÷ñc chån Qu¡ tr¼nh truy v¸t câ thº di¹n t£ nh÷ sau:
j := T[0];
while j <> m + 1 do
begin j := T[j];
end;
2.2 Bi¸n êi x¥u
B i to¡n: Cho x¥u kþ tü Y, x²t 3 ph²p bi¸n êi bi¸n:
1. Insert(i, C): i l sè, C l kþ tü: Ph²p Insert ch±n kþ tü C v o sau và tr½ i cõa x¥u Y.
2. Replace(i, C): i l sè, C l kþ tü: Ph²p Replace thay kþ tü t¤i và tr½ i cõa x¥u Y bði kþ tü C.
3. Delete(i): i l sè, Ph²p Delete xo¡ kþ tü t¤i và tr½ i cõa x¥u Y. Y¶u c¦u: Cho tr÷îc x¥u X, h¢y t¼m mët sè ½t nh§t c¡c ph²p bi¸n êi tr¶n º bi¸n x¥u Y th nh x¥u X.
Input: file v«n b£n XAU.INP
∗ Dáng 1: Chùa x¥u Y, (ë d i ≤100).
∗ Dáng 2: Chùa x¥u X, (ë d i ≤100).
Output: file v«n b£n XAU.OUT ghi c¡c ph²p bi¸n êi c¦n thüc hi»n v x¥u X t¤i méi ph²p bi¸n êi.
C¡ch gi£i:
èi vîi x¥u kþ tü th¼ vi»c xo¡, ch±n s³ l m cho c¡c ph¦n tû ph½a sau và tr½ bi¸n êi bà ¡nh ch¿ sè l¤i, g¥y khâ kh«n cho vi»c qu£n lþ và tr½. º khc phöc i·u n y, ta s³ t¼m mët thù tü bi¸n êi tho£ m¢n: Ph²p
H¼nh 2.3:
bi¸n êi t¤i và tr½ i bt buëc ph£i thüc hi»n sau c¡c ph²p bi¸n êi t¤i và tr½ i+ 1, i+ 2, . . .
V½ dö 2.2. Z =0 M N P Q0;
Insert(0, E) sau â Delete(4) cho ra Z =0 EM N P Q0. C¡ch n y khæng tu¥n thõ nguy¶n tc.
Delete(3) sau â Insert(0, E) cho ra Z =0 EM N Q0. C¡ch n y tu¥n thõ nguy¶n tc · ra. Nâi tâm l¤i ta s³ t¼m mët d¢y bi¸n êi câ và tr½ thüc hi»n gi£m d¦n.
Cæng thùc truy hçi: Gi£ sû m l ë d i x¥u Z v n l ë d i x¥u V. Gåi F[i, j] l sè ph²p bi¸n êi tèi thiºu º bi¸n x¥u gçm i kþ tü ¦u cõa x¥u Z : Z[1..i] th nh x¥u gçm j kþ tü ¦u cõa x¥u V : V[1..j]. Quan s¡t hai d¢y Z v V:
Ta nhªn th§y:
H¼nh 2.4:
1] th nh V[1..n − 1]. Tùc l trong tr÷íng hñp n y: F[m, n] =
F[m−1, n−1].
H¼nh 2.5:
∗ N¸u Z[m] 6= X[n] th¼ t¤i và tr½ Z[m] ta câ thº sû döng mët trong 3 ph²p bi¸n êi:
. Ho°c ch±n v o sau và tr½ m cõa Z, mët kþ tü óng b¬ng V n
H¼nh 2.6:
Th¼ khi â F[m, n] s³ b¬ng 1 ph²p thay vøa rçi cëng vîi sè ph²p bi¸n êi bi¸n d¢y Z[1..m − 1] th nh d¢y V[1..n − 1]:
H¼nh 2.7: . Ho°c xo¡ và tr½ thù m cõa Z:
Th¼ khi â F[m, n]s³ b¬ng 1 ph²p xo¡ vøa rçi cëng vîi sè ph²p bi¸n êi bi¸n d¢y Z[1..m−1] th nh d¢y V[1..n] : F[m, n] = 1 +F[m−1, n].
V¼ F[m, n] ph£i l nhä nh§t câ thº, n¶n trong tr÷íng hñp Z[m] 6=
V[n] th¼:
F[m, n] = min (F[m, n−1], F[m−1, n−1], F[m−1, n]) + 1. Ta x¥y düng xong cæng thùc truy hçi:
F[m, n] = F[m −1, n−1] Zm = Vn min (F[m, n −1], F[m −1, n−1], F[m−1, n]) + 1, Zm 6= Vn. Cì sð quy ho¤ch ëng:
∗ F[0, j] l sè ph²p bi¸n êi bi¸n x¥u réng th nh x¥u gçm j kþ tü ¦u cõa F. Nâ c¦n tèi thiºu j ph²p ch±n: F[0, j] = j.
∗ F[i,0] l sè ph²p bi¸n êi bi¸n x¥u gçm i kþ tü ¦u cõa S th nh x¥u réng, nâ c¦n tèi thiºu i ph²p xo¡: F[i,0] = i.
Vªy ¦u ti¶n b£ng ph÷ìng ¡n F (cï[0..m,0..n]) ÷ñc khði t¤o h ng 0 v cët 0 l cì sð quy ho¤ch ëng. Tø â dòng cæng thùc truy hçi t½nh ra t§t c£ c¡c ph¦n tû b£ng B.
Sau khi t½nh xong th¼ F[m, n] cho ta bi¸t sè ph²p bi¸n êi tèi thiºu. Truy v¸t: N¸u Z[m] = V[n] th¼ ch¿ vi»c x²t ti¸p F[m−1, n−1]. N¸u khæng, x²t 3 tr÷íng hñp:
∗ N¸u F[m, n] = F[m, n−1] + 1 th¼ ph²p bi¸n êi ¦u ti¶n ÷ñc sû döng l : Insert(m, V[n]).
∗ N¸u F[m, n] = F[m−1, n−1] + 1 th¼ ph²p bi¸n êi ¦u ti¶n ÷ñc sû döng l : Replace(m, V[n]).
∗ N uF[m, n] = F[m−1, n] + 1, th¼ ph²p bi¸n êi ¦u ti¶n ÷ñc sû döng l : Delete(m).
÷a v· b i to¡n vîi m, n nhä hìn truy v¸t ti¸p cho tîi khi v· F[0,0].
V½ dö 2.3. Z =0 M N P Q0; V =0 EM N Q0 b£ng ph÷ìng ¡n l : F 0 1 2 3 4 0 0 1 2 3 4 1 1 1 1 2 3 2 2 2 2 1 2 3 3 3 3 2 2 4 4 4 4 3 2
L÷u þ: khi truy v¸t, º tr¡nh truy nhªp ra ngo i b£ng, n¶n t¤o vi·n cho b£ng.
program StrOpt;
const
OutputFile = 'XAU.OUT'; max = 100;
var
X, Y: String[2 * max];
F: array[-1..max, -1..max] of Integer; m, n: Integer; procedure Enter; var fi: Text; begin Assign(fi, InputFile);
Reset(fi); ReadLn(fi, X); ReadLn(fi, Y); Close(fi); m := Length(X);
n := Length(Y); end;
function Min3(x, y, z: Integer): Integer; var t: Integer; begin if x < y then t := x else t := y; if z < t then t := z; Min3 := t; end; procedure Optimize; var i, j: Integer; begin
for i := 0 to m do F[i, -1] := max +1; for j := 0 to n do F[-1, j] := max + 1;
for i := 1 to m do for j := 1 to n do
if X[i] = Y[j] then F[i, j] := F[i - 1, j - 1]
else F[i, j] := Min3(F[i, j - 1], F[i - 1, j - 1], F[i - 1, j]) + 1; end; procedure Trace; var fo: Text; begin Assign(fo, OutputFile); Rewrite(fo); WriteLn(fo, F[m, n]); while (m <> 0) or (n <> 0) do if X[m] = Y[n] then begin Dec(m); Dec(n); end else begin Write(fo, X, ' -> '); if F[m, n] = F[m, n - 1] + 1 then begin
Write(fo, 'Insert(', m, ', ', Y[n], ')'); Insert(Y[n], X, m + 1); Dec(n);
end
else
if F[m, n] = F[m - 1, n - 1] + 1 then begin
Write(fo, 'Replace(', m, ', ', Y[n], ')'); X[m] := Y[n]; Dec(m); Dec(n);
end
begin Write(fo, 'Delete(', m, ')'); Delete(X, m, 1); Dec(m); end; WriteLn(fo, ' -> ', X); end; Close(fo); end; begin Enter; Optimize; Trace; end.
2.3 B i to¡n c¡i tói
B i to¡n: Mët cûa h ng b¡n ç trang sùc câ n mân h ng (n ≤ 100), mân h ng thù i câ trång l÷ñng l W[i] ≤ 100 v trà gi¡ V[i] ≤ 100
(sè nguy¶n). Mët t¶n trëm mang theo mët chi¸c tói câ thº üng ÷ñc tèi a trång l÷ñng M ( M ≤ 100). Häi t¶n trëm â s³ l§y nhúng mân h ng n o º ÷ñc têng gi¡ trà lîn nh§t. Bi¸t r¬ng méi mân ch¿ ÷ñc chån ho°c khæng chån.
Input: file v«n b£n BIGBAG.INP
. Dáng 1: Chùa hai sè n, M c¡ch nhau ½t nh§t mët d§u c¡ch.
. n dáng ti¸p theo, dáng thù i chùa hai sè nguy¶n d÷ìng W[i], V[i] c¡ch nhau ½t nh§t mët d§u c¡ch.
Output: file v«n b£n BIGBAG.OUT
. Dáng 1 : Ghi gi¡ trà lîn nh§t t¶n trëm câ thº l§y.
. Dáng 2 : Ghi ch¿ sè nhúng bà l§y.
H¼nh 2.8:
C¡ch gi£i: N¸u gåi F[i, j] l gi¡ trà lîn nh§t câ thº câ b¬ng c¡ch chån trong c¡c gâi 1,2, . . . , i vîi giîi h¤n trång l÷ñng j. Th¼ gi¡ trà lîn nh§t khi ÷ñc chån trong sè n gâi vîi giîi h¤n trång l÷ñng M ch½nh l
F[n, M]. V½ dö F[4,10] = 8, ngh¾a l trong tr÷íng hñp tèi ÷u têng gi¡ trà cõa c¡c mân h ng ÷ñc chån l 8, khi câ 4 mân ¦u ti¶n ÷ñc chån (tø mân 1 ¸n mân 4) v khèi l÷ñng tèi a cõa tói l 10.
Cæng thùc truy hçi t½nh F[i, j]: Vîi giîi h¤n trång l÷ñng j, vi»c chån tèi ÷u trong sè c¡c gâi 1,2, . . . , i−1, i º câ gi¡ trà lîn nh§t s³ câ hai kh£ n«ng:
∗ N¸u khæng chån gâi thù i th¼ F[i, j] l gi¡ trà lîn nh§t câ thº b¬ng c¡ch chån trong sè c¡c gâi 1,2, . . . , i−1 vîi giîi h¤n trång l÷ñng l j. Tùc l
F[i, j] = F[i−1, j]
∗ N¸u câ chån gâi thù i (t§t nhi¶n ch¿ x²t tîi tr÷íng hñp n y khi m W[i] ≤ j) th¼ F[i, j] b¬ng gi¡ trà gâi thù i l V[i] cëng vîi gi¡ trà lîn nh§t câ thº câ ÷ñc b¬ng c¡ch chån trong sè c¡c gâi
1,2, . . . , i−1 vîi giîi h¤n trång l÷ñng j −W[i]. Tùc l v· m°t gi¡ trà thu ÷ñc:
F[i, j] = V[i] +F[i−1, j−W[i]] V¼ theo c¡ch x¥y düng F[i, j] l gi¡ trà lîn nh§t câ thº, n¶n F[i, j] s³ l max trong 2 gi¡ trà thu ÷ñc ð tr¶n.
Cì sð quy ho¤ch ëng: D¹ th§y F[0, j] = 0, gi¡ trà lîn nh§t câ thº b¬ng c¡ch chån trong sè 0 gâi.
T½nh b£ng ph÷ìng ¡n: B£ng ph÷ìng ¡n F gçm n+ 1 dáng, M + 1
cët, tr÷îc ti¶n ÷ñc i·n cì sð quy ho¤ch ëng: Dáng 0 gçm to n sè 0. Sû döng cæng thùc truy hçi, dòng dáng 0 t½nh dáng 1, dòng dáng 1 t½nh dáng 2, v.v. . . ¸n khi t½nh h¸t dáng n.
Truy v¸t: T½nh xong b£ng ph÷ìng ¡n th¼ ta quan t¥m ¸n F[n, M]
â ch½nh l gi¡ trà lîn nh§t thu ÷ñc khi chån trong c£ n gâi vîi giîi h¤n trång l÷ñng M. N¸u F[n, M] = F[n−1, M] th¼ tùc l khæng chån gâi thù n, ta truy ti¸p F[n−1, M]. Cán n¸u F[n, M] 6= F[n−1, M]
th¼ ta thæng b¡o r¬ng ph²p chån tèi ÷u câ chån gâi thù n v truy ti¸p
F[n−1, M −W[n]]. Cù ti¸p töc cho tîi khi truy l¶n tîi h ng 0 cõa b£ng ph÷ìng ¡n.
H¼nh 2.9:
program Lucky_Bag;
const
InputFile = 'BIGBAG.INP';
OutputFile = 'BIGBAG.OUT'; max = 100; var
W, V: Array[1..max] of Integer; F: array[0..max, 0..max] of Integer; n, M: Integer; procedure Enter; var i: Integer; fi: Text; begin Assign(fi, InputFile); Reset(fi); ReadLn(fi, n, M);
for i := 1 to n do ReadLn(fi, W[i], V[i]); Close(fi);
end;
procedure Optimize; var
i, j: Integer; begin FillChar(F[0], SizeOf(F[0]), 0); for i := 1 to n do for j := 0 to M do begin F[i, j] := F[i - 1, j];
if (j >= W[i]) and (F[i, j] < F[i - 1, j - W[i]] + V[i]) then F[i, j] := F[i - 1, j - W[i]] + V[i];
end; end; procedure Trace; var fo: Text; begin
Assign(fo, OutputFile); Rewrite(fo); WriteLn(fo, F[n, M]); while n <> 0 do begin if F[n, M] <> F[n - 1, M] then begin Write(fo, n, ' '); M := M - W[n]; end; Dec(n); end; Close(fo); end; begin
Enter; Optimize; Trace; end.
KT LUN
Khâa luªn t¼m hiºu v· ph÷ìng ph¡p quy ho¤ch ëng v sû döng º gi£i b i to¡n tèi ÷u. K¸t qu£ ch½nh ¤t ÷ñc Khâa luªn l :
1. Tr¼nh b y c¡c ki¸n thùc cì b£n v· » quy (cæng thùc truy hçi, c i °t » quy, mët sè b i to¡n mang b£n ch§t » quy), b i to¡n tèi ÷u v ph÷ìng ph¡p quy ho¤ch ëng.
2. Tr¼nh b y v· gi£i mët sè b i to¡n sû döng ph÷ìng ph¡p quy ho¤ch ëng cì b£n: D¢y con ìn i»u t«ng d i nh§t, B i to¡n c¡i tói, Bi¸n êi x¥u.
V¼ thíi gian câ h¤n n¶n trong Khâa luªn khæng tr¡nh khäi sai sât. Em r§t mong nhªn sü âng gâp, þ ki¸n cõa c¡c th¦y cæ gi¡o v c¡c b¤n º khâa luªn ÷ñc ho n thi»n.
[1] Hç S¾ m(Chõ bi¶n, 2000), Mët sè ph÷ìng ph¡p gi£i b i to¡n trong tin håc, NXB Giaâ döc.
[2] L¶ Minh Ho ng (2014), Gi£i thuªt v lªp tr¼nh, Book online [3] Nguy¹n Quþ Khang, Ki·u V«n H÷ng (2002), B i tªp Pascal (tªp
2), NXB ¤i håc Quèc gia H Nëi.
[4] Robert Sedgewick (2004), C©m nang thuªt to¡n (tªp 1), NXB Khoa håc Kÿ thuªt
[5] Nguy¹n ùc Ngh¾a, Nguy¹n Tæ Th nh(2006), To¡n ríi r¤c, NXB NXB ¤i håc Quèc gia H Nëi.