Bi¸n êi x¥u

Một phần của tài liệu Phương pháp quy hoạch động giải một số bài toán tối ưu (Trang 32 - 39)

2 MËT SÈ B€I TON QUY HO„CH ËNG

2.2Bi¸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½. º kh­c 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 b­t 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 t­c.

Delete(3) sau â Insert(0, E) cho ra Z =0 EM N Q0. C¡ch n y tu¥n thõ nguy¶n t­c · 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: (adsbygoogle = window.adsbygoogle || []).push({});

∗ 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. (adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu Phương pháp quy hoạch động giải một số bài toán tối ưu (Trang 32 - 39)