You are on page 1of 133

Chng I.

K THUT THIT K THUT TON


It is not the strongest of the species that survives, nor the most
intelligent that survives. It is the one that is the most adaptable
to change
Charles Darwin
Chng ny gii thiu mt s k thut quan trng trong vic tip cn bi ton v tm
thut ton. Cc lp thut ton s c tho lun trong chng ny l: Vt cn
(exhaustive search), Chia tr (divide and conquer), Quy hoch ng (dynamic
programming) v Tham lam (greedy).
Cc bi ton trn thc th c mun hnh mun v, khng th a ra mt cch thc
chung tm gii thut cho mi bi ton. Cc phng php ny cng ch l nhng
chin lc kinh in.
Khc vi nhng thut ton c th m chng ta bit nh QuickSort, tm kim nh
phn,, cc vn trong chng ny khng th hc theo kiu thuc v ci t,
cng nh khng th tm thy cc thut ton ny trong bt c th vin lp trnh no.
Chng ta ch c th kho st mt vi bi ton c th v hc cch ngh, cch tip cn
vn , cch thit k gii thut. T rn luyn k nng linh hot khi gii cc bi
ton thc t.

Bi 1. Lit k
C mt s bi ton trn thc t yu cu ch r: trong mt tp cc i tng cho trc c bao
nhiu i tng tho mn nhng iu kin nht nh v l nhng i tng no. Bi ton
ny gi l bi ton lit k hay bi ton duyt.
Nu ta biu din cc i tng cn tm di dng mt cu hnh cc bin s th gii bi
ton lit k, cn phi xc nh c mt thut ton c th theo ln lt xy dng c
tt c cc cu hnh ang quan tm. C nhiu phng php lit k, nhng chng cn phi p
ng c hai yu cu di y:

Khng c lp li mt cu hnh

Khng c b st mt cu hnh

Trc khi ni v cc thut ton lit k, chng ta gii thiu mt s khi nim c bn:

1.1. Vi khi nim c bn


1.1.1. Th t t in
Nhc li rng quan h th t ton phn nh hn hoc bng k hiu trn mt tp hp ,
l quan h hai ngi tho mn bn tnh cht:
Vi

Tnh ph bin (Universality): Hoc l

Tnh phn x (Reflexivity):

Tnh phn i xng (Antisymmetry) : Nu

Tnh bc cu (Transitivity): Nu c

Cc quan h

, hoc
v

c th t suy ra t quan h

;
th bt buc

th

ny.

Trn cc dy hu hn, ngi ta cng xc nh mt quan h th t:


Xt

l hai dy di , trn cc phn t ca

phn . Khi

c quan h th t ton

nu nh :

Hoc hai dy ging nhau:

Hoc tn ti mt s nguyn dng

Th t gi l th t t in (lexicographic order) trn cc dy di .


Khi hai dy

c s phn t khc nhau, ngi ta cng xc nh c th t t in.

Bng cch thm vo cui dy

hoc dy

bng nhau, v coi nhng phn t

nhng phn t c bit gi l di ca

ny nh hn tt c cc phn t khc, ta li a v xc

nh th t t in ca hai dy cng di.


V d:
(
(

)
)

calculato

computer

Th t t in cng l mt quan h th t ton phn trn cc dy.

1.1.2. Chnh hp, t hp, hon v.


Cho

l mt tp hu hn gm

dng t 1 ti :

phn t v

l mt s t nhin. Gi

l tp cc s nguyn

Chnh hp lp
Mt nh x

c gi l mt chnh hp lp chp
Do

l tp hu hn (

( ( ) ( )

phn t) nn nh x

( )), v vy ta c th ng nht

ca

dy gi tr ny cng l mt chnh hp lp chp


V d

mt v ch mt phn t ( )

cho tng ng mi phn t

+. Mt nh x

c th xc nh qua bng cc gi tr
vi dy gi tr ( ( ) ( )

( )) v coi

ca .

cho bi:
1

()
tng ng vi tp nh (
S chnh hp lp chp

) l mt chnh hp lp ca
ca tp

phn t l

Chnh hp khng lp
Mi n nh

c gi l mt chnh hp khng lp chp

ca . Ni cch khc, mt

chnh hp khng lp l mt chnh hp lp c cc phn t khc nhau i mt.


V d mt chnh hp khng lp chp 3 (

) ca tp
1

()

S chnh hp khng lp chp

ca tp

phn t l

Hon v
Khi

mi song nh

c gi l mt hon v ca . Ni cch khc mt hon v

ca l mt chnh hp khng lp chp


V d: (

ca .

) l mt hon v ca
1
()

*
2

+
3

S hon v ca tp

phn t l

T hp
Mi tp con gm

phn t ca c gi l mt t hp chp

Ly mt t hp chp

ca , xt tt c

ca .

hon v ca n, mi hon v s l mt chnh hp

khng lp chp

ca . iu tc l khi lit k tt c cc chnh hp khng lp chp

mi t hp chp

s c tnh

S t hp chp

ca tp

th

ln. Nh vy nu xt v mt s lng:

phn t l . /

Ta c cng thc khai trin nh thc:


(

. /

V vy s . / cn c gi l h s nh thc (binomial coefficient) th , bc

1.2. Phng php sinh


Phng php sinh c th p dng gii bi ton lit k nu nh hai iu kin sau tho
mn:

C th xc nh c mt th t trn tp cc cu hnh t hp cn lit k. T c th


bit c cu hnh u tin v cu hnh cui cng theo th t .

Xy dng c thut ton t mt cu hnh cha phi cu hnh cui, sinh ra c cu


hnh k tip n.

1.2.1. M hnh sinh


Phng php sinh c th vit bng m hnh chung:
Xy dng cu hnh u tin;
repeat
a ra cu hnh ang c;
T cu hnh ang c sinh ra cu hnh k tip nu cn;
until ht cu hnh;

1.2.2. Lit k cc dy nh phn di


Mt dy nh phn di

l mt dy

trong

C th nhn thy rng mt dy nh phn


l biu din nh phn ca mt gi tr nguyn
( )
). S cc dy nh phn di bng , th t t in trn cc
( ) no (
dy nh phn di

tng ng vi quan h th t trn cc gi tr s m chng biu

din. V vy, lit k cc dy nh phn theo th t t in ngha l phi ch ra ln lt cc dy


nh phn biu din cc s nguyn theo th t

V d vi

, c 8 dy nh phn di 3 c lit k:
( )

000
0

001
1

010
2

011
3

Theo th t lit k, dy u tin l

100
4

101
5

110
6

111
7

v dy cui cng l

. Nu ta c mt dy

nh phn di , ta c th sinh ra dy nh phn k tip bng cch cng thm 1 (theo c


s 2 c nh) vo dy hin ti.
10101111
+ 1

10110000

Da vo tnh cht ca php cng hai s nh phn, cu hnh k tip c th sinh t cu hnh
hin ti bng cch: xt t cui dy ln u day (xet t hng n v ln), tm s 0 gp u
tin

Nu thy th thay s 0 bng s 1 v t tt c cc phn t pha sau v tr bng 0.

Nu khng thy th th ton dy l s 1, y l cu hnh cui cng.

Input
S nguyn dng .
Output
Cc dy nh phn di .
Sample Input
3

Sample Output
000
001
010
011
100
101
110
111

BINARYSTRINGS_GEN.PAS Thut ton sinh lit k cc dy nh phn

{$MODE OBJFPC}
program BinaryStringEnumeration;
var
x: AnsiString;
n, i: Integer;
begin
ReadLn(n);
SetLength(x, n);
FillChar(x[1], n, '0'); //Cu hnh ban u x=00..0

repeat
WriteLn(x);
//Tm s 0 u tin t cui dy

i := n;
while (i > 0) and (x[i] = '1') do Dec(i);
if i > 0 then N u tm thy
begin
x[i] := '1'; Thay x i b ng s
if i < n then
tx i n 0
FillChar(x[i + 1], n - i, '0');
end
else
Break;
h ng tm thy s 0 n{o trong d~y th dng
until False;
end.

1.2.3. Lit k cc tp con c

phn t

Ta s lp chng trnh lit k cc tp con

phn t ca tp

+ theo th t t

ien.
V d:

, c 10 tp con:

{1, 2, 3}

{1, 2, 4}

{1, 2, 5}

{1, 3, 4}

{1, 3, 5}

{1, 4, 5}

{2, 3, 4}

{2, 3, 5}

{2, 4, 5}

{3, 4, 5}

Bi ton lit k cc tp con


dy

phn t

phn t ca tp

+ c th quy v bi ton lit k cc

, trong

. Nu sp xp cc dy ny theo th

t t in, ta nhn thy:


Tp con u tin (cu hnh khi to) l *

+.

Tap con cuoi cung (cu hnh kt thc) l *


et mot tap con *

+ trong

, ta c nhn xt rng gii hn

trn (gi tr ln nht c th nhn) ca


qut: gii hn trn ca

+.

la

l n, ca

, ca

Tng

Cn tt nhin, gii hn di (gia tri nho nhat co the nhan) ca


T mot day

la

ai dien cho mot tap con cua S, neu tt c cc phn t trong x u t ti

gii hn tren th x la cau h nh cuoi cung, nu khng th ta phi sinh ra mt dy mi tng dn


tho man: day mi va ln hn dy c theo ngha khng c mt day k phn t no chen
gia chng khi sp th t t in.
V d:

. Cu hnh ang c

). Cc phn t

t ti gii

hn trn, nn sinh cu hnh mi ta khng th sinh bng cch tng mt phn t trong
s cac phan t
(
hnh mi

ln c, ta phi tng
ln 1 n v thanh
. c cu
). Cu hnh ny ln hn cu hnh trc nhng cha tho mn

tnh cht va ln. Mun t m cau h nh va u ln hn cau h nh cu, can co them thao
tac: Thay cac gia tri

bng cc gii hn di ca chung. Tc l:

Ta c cu hnh mi
li nhn thy rng
(
cau h nh mi

) l cu hnh k tip. Tiep tuc vi cau h nh nay, ta

cha t gii hn trn, nh vy ch cn tng


).

Thut toan sinh day con k tip t day ang co

c th xy dng nh sau:

Tm t cui dy ln u cho ti khi gp mt phn t

cha t gii hn trn

Nu tm thy:

Tng

ln 1

t tt c cc phn t

bng gii hn di cua chung

Nu khng tm thy tc l mi phn t t gii hn trn, y l cu hnh cui cng

Input
Hai s nguyn dng

Output
Cc tp con k phn t ca tp *

+
Sample Input
5 3

ln 1 l c

Sample
{1, 2,
{1, 2,
{1, 2,
{1, 3,
{1, 3,
{1, 4,
{2, 3,
{2, 3,
{2, 4,
{3, 4,

Output
3}
4}
5}
4}
5}
5}
4}
5}
5}
5}

SUBSETS_GEN.PAS Thut ton sinh lit k cc tp con

{$MODE OBJFPC}
program SubSetEnumeration;
const
max = 100;
var
x: array[1..max] of Integer;
n, k, i, j: Integer;
begin
ReadLn(n, k);
for i := 1 to k do x[i] := i;
repeat
In ra cu hnh hin t i

Write('{');
for i := 1 to k do
begin

h it ox

, , ,k

phn t

Write(x[i]);
if i < k then Write(', ');
end;
WriteLn('}');
uyt t cui d~y l n tm x i ch a t gii h n tr n n k + i

i := k;
while (i > 0) and (x[i] = n - k + i) do Dec(i);
if i > 0 then N u tm thy
begin
Inc(x[i]); Tng x i l n
tx i

k b ng gii h n d i ca ch ng

for j := i + 1 to k do x[j] := x[j - 1] + 1;


end
else Break;
until False;
end.

1.2.4. Lit k cc hon v


Ta s lp chng trnh lit k cc hon v ca tp

+ theo th t t in.

V d vi n = 3, c 6 hon v:
(

Mi hon v ca tp

) (

) (

) (

) (

) (

+ c th biu din di dng mt mt dy s

. Theo

th t t in, ta nhn thy:


Hon v u tin cn lit k: (

Hon v cui cng cn lit k: (


Bt u t hon v (

), ta s sinh ra cc hon v cn li theo quy tc: Hon v s sinh

ra phi l hon v va ln hn hon v hin ti theo ngha khng th c mt hon v no


khc chen gia chng khi sp th t.
Gi s hon v hin ti l

), xt 4 phn t cui cng, ta thy chng c

xp gim dn, iu c ngha l cho d ta c hon v 4 phn t ny th no, ta cng


c mt hon v b hn hon v hin ti. Nh vy ta phi xt n

v thay n

bng mt gi tr khc. Ta s thay bng gi tr no?, khng th l 1 bi nu vy s c


hon v nh hn, khng th l 3 v c

ri (phn t sau khng c chn vo

nhng gi tr m phn t trc chn). Cn li cc gi tr: 4, 5 v 6. V cn mt hon v


va ln hn hin ti nn ta chn
. Cn cc gi tr
s ly trong tp
*
+. Cng v tnh va ln nn ta s tm biu din nh nht ca 4 s ny gn cho
(
). Vy hon v mi s l (
).
tc l

Ta c nhn xt g qua v d ny: on cui ca hon v hin ti

c xp gim dn, s

l s nh nht trong on cui gim dn tho mn iu kin ln hn


. Nu o
), trong on cui
gi tr v th ta s c hon v (
vn c sp xp
gim dn. Khi mun biu din nh nht cho cc gi tr trong on cui th ta ch cn o
ngc on cui.

) th hon v k tip s l (
Trong trng hp hon v hin ti l (
). Ta cng c
) c on cui gim dn, on cui ny ch gm 1 phn t (4)
th coi hon v (
Thut ton sinh hon v k tip t hon v hin ti c th xy dng nh sau:
c nh on cui gim dn di nht, tm ch s ca phn t

ng lin trc on cui

. iu ny ng ngha vi vic tm t v tr st cui dy ln u, gp ch s u tin tha


mn

.
Nu tm thy ch s nh trn

Trong on cui gim dn, tm phn t

nh nht va ln hn

. Do on

cui gim dn, iu ny thc hin bng cch tm t cui dy ln u gp ch s


u tin tho mn

(c th dng tm kim nh phn).

o gi tr

Lt ngc th t on cui gim dn (

), on cui tr thnh tng dn.

Nu khng tm thy tc l ton dy sp gim dn, y l cu hnh cui cng

Input
S nguyn dng
Output
Cc hon v ca dy (

)
Sample Input
3

Sample
(1, 2,
(1, 3,
(2, 1,
(2, 3,
(3, 1,
(3, 2,

Output
3)
2)
3)
1)
2)
1)

PERMUTATIONS_GEN.PAS Thut ton sinh lit k hon v

{$MODE OBJFPC}
program PermutationEnumeration;
const
max = 100;
var
x: array[1..max] of Integer;
n, i, k, l, h: Integer;
//Th tc o gi tr hai tham bi n x, y

procedure Swap(var x, y: Integer);


var
temp: Integer;
begin
temp := x; x := y; y := temp;
end;
begin
ReadLn(n);

for i := 1 to n do x[i] := i;
repeat
//In cu hnh hin t i

Write('(');
for i := 1 to n do
begin
Write(x[i]);
if i < n then Write(', ');
end;
WriteLn(')');
//Sinh cu hnh k ti p
//Tm i l ch s ng tr c o n cui gim dn

i := n - 1;
while (i > 0) and (x[i] > x[i + 1]) do Dec(i);
if i > 0 then //N u tm thy
begin
//Tm t cui dy phn t u tin (x[k]) ln hn x i

k := n;
while x[k] < x[i] do Dec(k);
o gi tr x[k] v x[i]

Swap(x[k], x[i]);
//Lt ng c th t o n cui gim dn, o n cui tr th{nh tng dn

l := i + 1; h := n;
while l < h do
begin
Swap(x[l], x[h]);
Inc(l);
Dec(h);
end;
end
else Break; //C dy l gim dn, h t cu hnh
until False;
end.

Nhc im ca phng php sinh l khng th sinh ra c cu hnh th


c cu hnh th

nu nh cha

, iu lm phng php sinh t tnh ph dng trong nhng thut

ton duyt hn ch. Hn th na, khng phi cu hnh ban u lc no cng d tm c,


khng phi k thut sinh cu hnh k tip cho mi bi ton u n gin (Sinh cc chnh hp
khng lp chp

theo th t t in chng hn). Ta sang mt chuyn mc sau ni n mt

phng php lit k c tnh ph dng cao hn, gii cc bi ton lit k phc tp hn
l: Thut ton quay lui (Back tracking).

1.3. Thut ton quay lui


Thut ton quay lui dng gii bi ton lit k cc cu hnh. Thut ton ny lm vic theo
cch:

Mi cu hnh c xy dng bng cch xy dng tng phn t

Mi phn t c chn bng cch th tt c cc kh nng.

Gi s cu hnh cn lit k c dng


c th nhn, th cho
s xt tt c cc gi tr

, khi thut ton quay lui s xt tt c cc gi tr

nhn ln lt cc gi tr . Vi mi gi tr th gn cho
c th nhn, li th cho

, thut ton

nhn ln lt cc gi tr . Vi mi gi

tr th gn cho

li xt tip cc kh nng chn

, c tip tc nh vy Mi khi ta tm c

y mt cu hnh th lit k ngay cu hnh .


C th m t thut ton quay lui theo cch quy np: Thut ton s lit k cc cu hnh
phn t dng
gn cho

bng cch th cho

nhn ln lt cc gi tr c th. Vi mi gi tr th

, thut ton tip tc lit k ton b cc cu hnh

phn t

...

1.3.1. M hnh quay lui


//Th tc ny th cho x[i] nhn ln l t cc gi tr m n c th nhn

procedure Attempt(i);
begin
for mi gi tr v c th gn cho x[i] do
begin
Th cho x[i] := v;
if x[i] l phn t cui cng trong cu hnh then
Thng bo cu hnh tm c
else
begin
Ghi nhn vic cho x[i] nhn gi tr V (nu cn);
Attempt(i + 1); //Gi quy chn ti p x[i+1]
Nu cn, b ghi nhn vic th x[i] := V th gi tr khc;
end;
end;
end;

Thut ton quay lui s bt u bng li gi

( ).

Tn gi thut ton quay lui l da trn c ch duyt cc cu hnh: Mi khi th chn mt gi


tr cho

, thut ton s gi quy tm tip

, v c nh vy cho ti khi tin trnh

duyt xt tm ti phn t cui cng ca cu hnh. Cn sau khi xt ht tt c kh nng chn


, tin trnh s li li th p t mt gi tr khc cho

1.3.2. Lit k cc dy nh phn


Biu din dy nh phn di di dng dy
. Ta s lit k cc dy ny bng cch th
dng cc gi tr * + gn cho . Vi mi gi tr th gn cho li th cc gi tr c th gn
cho

Sau y l chng trnh lit k cc dy nh phn vi quy nh khun dng Input/Output nh


trong mc 1.2.2.

BINARYSTRINGS_BT.PAS Thut ton quay lui lit k cc dy nh phn

{$MODE OBJFPC}
program BinaryStringEnumeration;
var
x: AnsiString;
n: Integer;
procedure Attempt(i: Integer); //Th cc cch chn x[i]
var

j: AnsiChar;
begin
for j := '0' to '1' do //Xt cc gi tr j c th gn cho x[i]
begin //Vi mi gi tr
x[i] := j; //Th t x[i]
if i = n then WriteLn(x) //N u i = n th in k t qu
else Attempt(i + 1); //N u x i ch a phi phn t cui th tm ti p x[i + 1]
end;
end;
begin
ReadLn(n);
SetLength(x, n);
Attempt(1); //Kh i ng thut ton quay lui
end.

V d: Khi

, cc li gi quy thc hin thut ton quay lui c th v nh cy trong

Hnh 1-1.
Attempt(1)
x1:=0

x1:=1
Attempt(2)

Attempt(2)
x2:=0

x2:=1

Attempt(3)

Attempt(3)

x3:=0

x3:=0

000

x3:=1
001

x2:=1

x2:=0
Attempt(3)

x3:=1

x3:=0

011

010

Attempt(3)

x3:=1

x3:=0

001

000

010

x3:=1
011

Hnh 1-1. Cy tm kim quay lui trong bi ton lit k dy nh phn

1.3.3. Lit k cc tp con c


lit k cc tp con

phn t

phn t ca tp

, y

+ ta c th a v lit k cc cu hnh

Theo cc nhn xt mc 1.2.3, gi tr cn di v cn trn ca

l:
(1.1)

(Gi thit rng c thm mt s

khi xt cng thc (1.1) vi


t 1 (

Thut ton quay lui s xt tt c cc cch chn


tr , xt tip tt c cc cch chn
n

) n

)
, vi mi gi

, c nh vy khi chn c

th ta c mt cu hnh cn lit k.

Di y l chng trnh lit k cc tp con

phn t bng thut ton quay lui vi khun

dng Input/Output nh quy nh trong mc 1.2.3.

SUBSETS_BT.PAS Thut ton quay lui lit k cc tp con

phn t

{$MODE OBJFPC}
program SubSetEnumeration;
const
max = 100;
var
x: array[0..max] of Integer;
n, k: Integer;
procedure PrintResult; //In ra tp con {x[1..k]}
var
i: Integer;
begin
Write('{');
for i := 1 to k do
begin
Write(x[i]);
if i < k then Write(', ');
end;
WriteLn('}');
end;
procedure Attempt(i: Integer); //Th cc cch chn gi tr cho x[i]
var
j: Integer;
begin
for j := x[i - 1] + 1 to n - k + i do
begin
x[i] := j;
if i = k then PrintResult
else Attempt(i + 1);
end;
end;
begin
ReadLn(n, k);
x[0] := 0;
Attempt(1); //Kh i ng thut ton quay lui
end.

V c bn, cc chng trnh ci t thut ton quay lui ch khc nhau th tc


d chng trnh lit k dy nh phn, th tc ny s th chn cc gi tr 0 hoc 1 cho
cn chng trnh lit k cc tp con
gi tr nguyn t cn di

phn t, th tc ny s th chn

ti cn trn

. V
;

l mt trong cc

. Qua ta c th thy tnh ph

dng ca thut ton quay lui: m hnh ci t c th thch hp cho nhiu bi ton. phng
php sinh tun t, vi mi bi ton li phi c mt thut ton sinh cu hnh k tip, iu
lm cho vic ci t mi bi mt khc, bn cnh , khng phi thut ton sinh k tip no
cng d tm ra v ci t c.

1.3.4. Lit k cc chnh hp khng lp chp


lit k cc chnh hp khng lp chp
cu hnh

, cc

ca tp

+ ta c th a v lit k cc

v khc nhau i mt.

( ) xt tt c cc kh nng chn

Th tc

b cc phn t ng trc

s th ht cc gi tr t 1 n n cha

chn. Mun xem cc gi tr no cha c chn ta s dng

k thut dng mng nh du:

Khi to mt mng

- mang kiu logic boolean. y

, - cho bit gi tr

c cn t do hay b chn ri. Ban u khi to tt c cc phn t mng

- l

True c ngha l cc gi tr t 1 n n u t do.

Ti bc chn cc gi tr c th ca

ta ch xt nhng gi tr cn t do (

,-

).

Trc khi gi quy


,-

l b chn (

) th chn tip
) cc th tc

: ta t gi tr va gn cho
(
),
(
)

gi sau ny khng chn phi gi tr na.


(
): c ngha l sp ti ta s th gn mt gi tr khc cho
Sau khi gi quy
th ta s t gi tr

va th cho

thnh t do (

nhn mt gi tr khc ri th cc phn t ng sau (

,-

), bi khi

) hon ton c th nhn li

gi tr .

Tt nhin ta ch cn lm thao tc ng du/b nh du trong th tc


, bi khi

th tip theo ch c in kt qu ch khng cn phi chn thm phn

t no na.
Input
Hai s nguyn dng

).

Output
Cc chnh hp khng lp chp

ca tp *
Sample Input
3 2

( ) c

+
Sample Output
(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)

ARRANGE_BT.PAS Thut ton quay lui lit k cc chnh hp khng lp

{$MODE OBJFPC}
program ArrangementEnumeration;
const
max = 100;
var

x: array[1..max] of Integer;
Free: array[1..max] of Boolean;
n, k: Integer;
procedure PrintResult; //Th tc in cu hnh tm c
var
i: Integer;
begin
Write('(');
for i := 1 to k do
begin
Write(x[i]);
if i < k then Write(', ');
end;
WriteLn(')');
end;
procedure Attempt(i: Integer); //Th cc cch chn x[i]
var
j: Integer;
begin
for j := 1 to n do
if Free[j] then //Ch xt nhng gi tr j cn t do
begin
x[i] := j;
if i = k then PrintResult //N u ~ chn c n x[k] th in k t qu
else
begin
Free[j] := False;
|nh du j ~ b chn
Attempt(i + 1); //Attempt(i + 1) s ch xt nhng gi tr cn t do gn cho x[i+1]
Free[j] := True; //B |nh du, sp ti s th mt cch chn khc ca x[i]
end;
end;
end;
begin
ReadLn(n, k);
FillChar(Free[1], n, True);
Attempt(1); //Kh i ng thut ton quay lui
end.

Khi

th y l chng trnh lit k hon v.

1.3.5. Lit k cc cch phn tch s


Cho mt s nguyn dng , hy tm tt c cc cch phn tch s

thnh tng ca cc s

nguyn dng, cc cch phn tch l hon v ca nhau ch tnh l 1 cch v ch c lit k
mt ln.
Ta s dng thut ton quay lui lit k cc nghim, mi nghim tng ng vi mt dy ,
trnh s trng lp khi lit k cc cch phn tch, ta a thm rng buc: dy

phi c th

t khng gim:
Thut ton quay lui c ci t bng th tc quy
ca

, mi khi th xong mt gi tr cho

( ): th cc gi tr c th nhn

, th tc s gi quy

) th cc

gi tr c th cho

. Trc mi bc th cc gi tr cho

ca tt c cc phn t ng trc
R rng gi tr nh nht m

v th nh gi min gi tr m

c th nhn chnh l

s rng c thm mt phn t

v dy

l tng

c th nhn.

c th t khng gim (Gi

, phn t ny khng tham gia vo vic lit k cu hnh

m ch dng hp thc ho gi tr cn di ca
Nu

, ta lu tr

cha phi l phn t cui cng, tc l s phi chn tip t nht mt phn t

na m vic chn thm

khng lm cho tng vt qu . Ta c:

(1.2)

Tc l nu

cha phi phn t cui cng (cn gi quy chn tip

c th nhn l

, cn d nhin nu

) th gi tr ln nht

l phn t cui cng th bt buc

phi bng

.
( ) s gi quy

Vy th th tc

) tm tip khi m gi tr

chn cn cho php chn thm mt phn t khc ln hn hoc bng n m khng lm tng
vt qu :

. Ngc li, th tc ny s in kt qu ngay nu

mang gi tr ng

bng s thiu ht ca tng


phn t u so vi . V d n gin khi
th th
*
+ l vic lm v ngha v nh vy cng khng ra nghim m cng khng chn
tip

c na.

Vi gi tr khi to
v
, thut ton quay lui s c khi ng bng li gi
( ) v hot ng theo cch sau:

Vi mi gi tr :

, th gn

, cp nht

quy tm tip, sau khi th xong cc gi tr c th cho


nh c

Cui cng gn

Input
S nguyn dng
Output
Cc cch phn tch s .

trc khi th gn mt gi tr khc cho


v in kt qu ra dy

, bin
.

, sau gi
c phc hi li

Sample Input
6

Sample Output
6 = 1+1+1+1+1+1
6 = 1+1+1+1+2
6 = 1+1+1+3
6 = 1+1+2+2
6 = 1+1+4
6 = 1+2+3
6 = 1+5
6 = 2+2+2
6 = 2+4
6 = 3+3
6 = 6

NUMBERPARTITION_BT.PAS Lit k cc cch phn tch s

{$MODE OBJFPC}
program NumberPartitioning;
const
max = 100;
var
x: array[0..max] of Integer;
n, m: Integer;
procedure Init; //Kh i t o
begin
m := 0;
x[0] := 1;
end;
procedure PrintResult(k: Integer); //In k t qu ra dy x[1..k]
var
i: Integer;
begin
Write(n, ' = ');
for i := 1 to k - 1 do Write(x[i], '+');
WriteLn(x[k]);
end;
procedure Attempt(i: Integer); //Thut ton quay lui
var
j: Integer;
begin
for j := x[i - 1] to (n - m) div 2 do Tr ng hp cn chn ti p x[i+1]
begin
x[i] := j; //Th t x[i]
m := m + j; //Cp nht tng m
Attempt(i + 1); //Chn ti p
m := m - j; //Phc hi tng m
end;
x[i] := n - m; //N u x[i] l phn t cui th n bt buc phi l n-m
PrintResult(i); //In k t qu
end;
begin
ReadLn(n);
Init;

Attempt(1); //Kh i ng thut ton quay lui


end.

By gi ta xt tip mt v d kinh in ca thut ton quay lui

1.3.6. Bi ton xp hu
Xt bn c tng qut kch thc

. Mt qun hu trn bn c c th n c cc qun

khc nm ti cc cng hng, cng ct hoc cng ng cho. Hy tm cc xp


trn bn c sao cho khng qun no n qun no. V d mt cch xp vi

qun hu
c ch ra

trong Hnh 1-2.

Hnh 1-2. Mt cch xp 8 qun hu ln bn c

Nu nh s cc hng t trn xung di theo th t t 1 ti , cc ct t tri qua phi theo


th t t 1 ti . Th khi t

qun hu ln bn c, mi hng phi c ng 1 qun hu (hu

n c ngang), ta gi qun hu s t hng 1 l qun hu 1, qun hu hng 2 l qun


hu 2 qun hu hng

l qun hu . Vy mt nghim ca bi ton s c bit khi ta

tm ra c v tr ct ca nhng qun hu.


nh hng bn c theo 4 hng: ng (Phi), Ty (Tri), Nam (Di), Bc (Trn). Mt
) (hng , ct ) s khng ch.
qun hu (

Ton b hng

Ton b ct

Ton b cc (

) tha mn ng thc

. Nhng ny nm trn mt

ng cho theo hng ng Bc-Ty Nam (B-TN).

Ton b cc (

) tha mn ng thc

. Nhng ny nm trn mt

ng cho ng Nam-Ty Bc (N-TB)


T nhng nhn xt , ta c tng nh s cc ng cho trn bn c.

Vi mi hng s

. Tt c cc (

) trn bn c tha mn

nm

trn mt ng cho B-TN, gi ng cho ny l ng cho B-TN mang ch s

. Tt c cc (

Vi mi hng s

) trn bn c tha mn

nm trn mt ng cho N-TB, gi ng cho ny l ng cho N-TB mang ch


s

N
1
1
2

7
8

3
W

Hnh 1-3. ng cho BTN mang ch s 10 v ng cho NTB mang ch s 0

Chng ta s s dng ba mng logic nh du:

Mng

nu nh ct cn t do,

nu nh ct b mt qun

hu khng ch.

Mng

nu nh ng cho B-TN th

cn t do,

nu

nh ng cho b mt qun hu khng ch.

Mng

nu nh ng cho N-TB th cn t do,

nu

nh ng cho b mt qun hu khng ch.


Ban u c 3 mng nh du u mang gi tr

. (Cha c qun hu no trn bn c, cc

ct v ng cho u t do)
Thut ton quay lui:
Xt tt c cc ct, th t qun hu 1 vo mt ct, vi mi cch t nh vy, xt tt c cc
cch t qun hu 2 khng b qun hu 1 n, li th 1 cch t v xt tip cc cch t qun
hu 3Mi khi t c n qun hu , ta in ra cch xp hu v dng chng trnh.

Khi chn v tr ct cho qun hu th , ta phi chn (

) khng b cc qun hu t

trc n, tc l phi chn tha mn: ct cn t do:

, ng cho B-TN

ch s

cn t do:

, ng cho N-TB ch s

cn t do;

Khi th t c qun hu vo (
mt nghim. Nu khng:

), nu l qun hu cui cng (

) th ta c

Trc khi gi quy tm cch t qun hu th

, ta nh du ct v 2 ng

cho b qun hu va t khng ch:

cc ln gi

quy tip sau chn cch t cc qun hu k tip s khng chn vo nhng b qun
hu va t khng ch.

Sau khi gi quy tm cch t qun hu th

, c ngha l sp ti ta li th

mt cch t khc cho qun hu , ta b nh du ct v 2 ng cho va b qun


hu va th t khng ch

tc l ct v 2 ng cho

li thnh t do, bi khi t qun hu

sang v tr khc ri th trn ct

v 2

ng cho hon ton c th t mt qun hu khc


Hy xem li trong cc chng trnh lit k chnh hp khng lp v hon v v k thut nh
du. y ch khc vi lit k hon v l: lit k hon v ch cn mt mng nh du xem gi
tr c t do khng, cn bi ton xp hu th cn phi nh du c 3 thnh phn: Ct, ng
cho BTN, ng cho NTB. Trng hp n gin hn: Yu cu lit k cc cch t
qun xe ln bn c

sao cho khng qun no n qun no chnh l bi ton lit k hon

v.
Input
S nguyn dng
Output
Mt cch t cc qun hu ln bn c
Sample Input
8

Sample Output
(1, 1)
(2, 5)
(3, 8)
(4, 6)
(5, 3)
(6, 7)
(7, 2)
(8, 4)

NQUEENS_BT.PAS Thut ton quay lui gii bi ton xp hu

{$MODE OBJFPC}
program NQueens;
const
max = 100;
var
n: Integer;
x: array[1..max] of Integer;
a: array[1..max] of Boolean;
b: array[2..2 * max] of Boolean;
c: array[1 - max..max - 1] of Boolean;
Found: Boolean;
procedure PrintResult; //In k t qu mi khi tm ra nghim

var
i: Integer;
begin
for i := 1 to n do WriteLn('(', i, ', ', x[i], ') ');
Found := True;
end;
//Kim tra (i, j) cn t do hay b mt qun hu khng ch ?

function IsFree(i, j: Integer): Boolean;


begin
Result := a[j] and b[i + j] and c[i - j];
end;
|nh du / b |nh du mt (i, j)

procedure SetFree(i, j: Integer; Enabled: Boolean);


begin
a[j] := Enabled;
b[i + j] := Enabled;
c[i - j] := Enabled;
end;
procedure Attempt(i: Integer); //Th c|c c|ch t qun hu i vo hng i
var
j: Integer;
begin
for j := 1 to n do //Xt tt c cc ct
if IsFree(i, j) then //Tm v tr t ch a b khng ch
begin
x[i] := j; //Th t vo (i, j)
if i = n then
begin
PrintResult;
t n con hu n th in ra 1 nghim
Exit;
end
else
begin
SetFree(i, j, False);
|nh du
Attempt(i + 1); //Th c|c c|ch t qun hu th i + 1
if Found then Exit;
SetFree(i, j, True); //B |nh du
end;
end;
end;
begin
ReadLn(n);
|nh du tt c cc ct v{ ng cho l t do

FillChar(a[1], n, True);
FillChar(b[2], 2 * n - 1, True);
FillChar(c[1 - n], 2 * n - 1, True);
Found := False;
Attempt(1); //Kh i ng thut ton quay lui
end.

Thut ton dng mt bin

lm c bo xem tm ra nghim hay cha, nu

, thut ton quay lui s ngng ngay qu trnh tm kim.

Mt sai lm d mc phi l ch t lnh dng thut ton quay lui trong php th
if i = n then
begin
PrintResult;
Exit;
end;

( ), mun ngng c mt

Nu lm nh vy lnh Exit ch c tc dng trong th tc


dy

chuyn
( )

quy,
(

cn
)

phi

thot

lin

mt

lot

cc

th

tc

quy:

( ). t lnh Exit vo sau li gi quy chnh l

t lnh Exit cho c mt dy chuyn quy mi khi tm ra nghim.


Mt s mi trng lp trnh c lnh dng c chng trnh (nh on chng trnh trn
chng ta c th dng lnh Halt thay cho lnh Exit). Nhng nu thut ton quay lui ch l mt
phn trong chng trnh, sau khi thc hin thut ton s cn phi lm nhiu vic khc na,
khi lnh ngng v iu kin c chng trnh ngay khi tm ra nghim l khng c php.
Ci t dy Exit l mt cch lm chnh thng ngng dy chuyn quy.

1.4. K thut nhnh cn


C mt lp bi ton t ra trong thc t yu cu tm ra mt nghim tho mn mt s iu
kin no , v nghim l tt nht theo mt ch tiu c th, l lp bi ton ti u
(optimization). Nghin cu li gii cc lp bi ton ti u thuc v lnh vc quy hoch ton
hc. Tuy nhin cng cn phi ni rng trong nhiu trng hp chng ta cha th xy dng
mt thut ton no thc s hu hiu gii bi ton, m cho ti nay vic tm nghim ca
chng vn phi da trn m hnh lit k ton b cc cu hnh c th v nh gi, tm ra cu
hnh tt nht. Vic tm phng n ti u theo cch ny cn c tn gi l vt c n (exhaustive
search). Chnh nh k thut ny cng vi s pht trin ca my tnh in t m nhiu bi
ton kh tm thy li gii.
Vic lit k cu hnh c th ci t bng cc phng php lit k: Sinh tun t v tm kim
quay lui. Di y ta s tm hiu k hn c ch ca thut ton quay lui gii thiu mt
phng php hn ch khng gian duyt.
M hnh thut ton quay lui l tm kim trn mt cy phn cp. Nu gi thit rng mi nt
nhnh ca cy ch c 2 nt con th cy c cao

s c ti

nt l, con s ny ln hn rt

nhiu ln so vi kch thc d liu u vo . Chnh v vy m nu nh ta c thao tc tha


trong vic chn

th s phi tr gi rt ln v chi ph thc thi thut ton bi qu trnh tm

kim lng vng v ngha trong cc bc chn k tip

, Khi , mt vn t ra

l trong qu trnh lit k li gii ta cn tn dng nhng thng tin tm c lo i b sm


nhng ph ng |n chc chn khng phi ti u. K thut gi l k thut nh gi nhnh
cn (Branch-and-bound) trong tin trnh quay lui.

1.4.1. M hnh k thut nhnh cn


Da trn m hnh thut ton quay lui, ta xy dng m hnh sau:
procedure Init;
begin
Khi to mt cu hnh bt k best;
end;
//Th tc ny th chn cho x[i] tt c cc gi tr n c th nhn

procedure Attempt(i: Integer);


begin
for Mi gi tr v c th gn cho x[i] do
begin
Th t x[i] := v;
if Cn hi vng tm ra cu hnh tt hn best then
if x[i] l phn t cui cng trong cu hnh then
Cp nht best
else
begin
Ghi nhn vic th x[i] := v nu cn;
Attempt(i + 1); //Gi quy, chn ti p x[i + 1]
B ghi nhn vic th cho x[i] := v (nu cn);
end;
end;
end;
begin
Init;
Attempt(1);
Thng bo cu hnh ti u best;
end.

K thut nhnh cn thm vo cho thut ton quay lui kh nng nh gi theo tng bc, nu
ti bc th , gi tr th gn cho

khng c hi vng tm thy cu hnh tt hn cu hnh

th th gi tr khc ngay m khng cn phi gi quy tm tip hay ghi nhn kt qu


na. Nghim ca bi ton s c lm tt dn, bi khi tm ra mt cu hnh mi tt hn
ta s cp nht

bng cu hnh mi va tm c.

Di y ta s kho st mt vi k thut nh gi nhnh cn qua cc bi ton c th.

1.4.2. th con y cc i
Bi ton tm th con y cc i (Clique) l mt bi ton c rt nhiu ng dng trong
cc mng x hi, tin sinh hc, mng truyn thng, nghin cu cu trc phn t Ta c th
pht biu bi ton mt cch hnh thc nh sau: C

ngi v mi ngi c quen bit mt s

ngi khc. Gi s quan h quen bit l quan h hai chiu, tc l nu ngi quen ngi
th ngi cng quen ngi v ngc li. Vn l hy chn ra mt tp gm nhiu ngi
nht trong s

ngi cho hai ngi bt k c chn phi quen bit nhau.

Tuy c rt nhiu nghin cu v bi ton Clique nhng ngi ta vn cha tm ra c


thut ton vi phc tp a thc. Ta s trnh by mt cch gii bi ton Clique bng thut
ton quay lui kt hp vi k thut nhnh cn.
M hnh duyt
{

Cc quan h quen nhau c biu din bi ma trn


nh ngi quen ngi v
ca bi ton, ma trn

trong

nu

nu nh ngi khng quen ngi . Theo gi thit

l ma trn i xng:

).

R rng vi mt ngi bt k th c hai kh nng: ngi c chn hoc ngi khng


(
) trong
c chn. V vy mt nghim ca bi ton c th biu din bi dy

Gi

nu ngi th c chn v

nu ngi th khng c chn.

l s ngi c chn tng ng vi dy , tc l s v tr

Phng n ti u c lu tr bi mng
tng ng vi dy

-, vi
,

. n gin, ta khi to mng

, sau phng n

v bin

.
l s ngi c chn
- bi gi tr
v

s c thay bng nhng phng n tt

hn trong qu trnh duyt. Trn thc t, phng n

c th khi to bng mt thut

ton gn ng.
M hnh duyt c thit k nh m hnh lit k cc dy nh phn bng thut ton quay lui:
Th hai gi tr True/False cho

, vi mi gi tr va th cho

li th hai gi tr ca

, - l s ngi quen ca ngi v


, - l s ngi quen ca ngi m
, - c xc nh ngay t u cn gi tr
, - s c cp nht
c chn. Gi tr
Gi

ngay lp tc mi khi ta th quyt nh chn hay khng chn mt ngi quen vi (


).
,
- v
,
- c s dng trong hm cn hn ch bt khng gian
Mng
duyt.
Hm cn
Thut ton quay lui c thc hin quy thng qua th tc

( ): Th hai gi tr c

( ) v khi th tc
th gn cho . Dy chuyn quy c bt u t th tc
( ) c gi th ta ang c mt phng n chn trn tp nhng ngi t 1 ti
v s ngi c chn trong tp ny l .
Trong nhng ngi t ti , chc chn nu c chn thm th ta ch c php chn nhng
,,,ngi m
v
. iu ny khng kh gii thch:
,c ngha l ngi khng quen vi t nht mt ngi chn; cn
c ngha
l nu ngi

c chn, phng n tm c chc chc khng th c nhiu hn

ngi, khng tt hn phng n

hin c.

Nhn xt trn l c s thit lp hm cn: Khi th tc


,ngi trong phm vi t ti c
v

( ) c gi, ta lc ra nhng
,-

v lp gi thuyt rng

trong trng hp tt nht, tt c nhng ngi ny s c chn thm. Gi thuyt ny cho


php ta c lng cn trn ca s ngi c chn cn c vo dy cc quyt nh
,
- c trc . Nu gi tr cn trn ny vn
, c th kt lun ngay rng
- khng th dn ti phng n tt hn phng n
dy quyt nh ,
cho d ta
c th ht nhng kh nng c th ca ,
gn gi tr cho
,
-.

-. Th tc

( ) s khng tin hnh th

na m thot ngay, dy chuyn quy li li thay i dy quyt nh

Ngoi ra, th tc
,Nu nh

( ) khng nht thit phi th hai gi tr True/False gn cho , -.


,hoc
th ch cn th , l , v trong

trng hp ny nu chn ngi th s b xung t vi nhng quyt nh chn trc hoc


khng cn tim nng tm ra phng n tt hn

Ci t
Ta s ci t bi ton Clique vi khun dng Input/Output nh sau:
Input

Dng 1 cha s ngi

v s quan h quen bit

cch nhau t nht mt du

cch

dng tip theo, mi dng cha hai s nguyn


bit v mt quan h: hai ngi

cch nhau t nht mt du cch cho

quen nhau

Output
Phng n chn ra nhiu ngi nht hai ngi bt k u quen nhau.

Sample Input
6 10
1 2
1 3
2 3
2 4
2 6
3 4
3 6
4 5
4 6
5 6

CLIQUE_BB.PAS

{$MODE OBJFPC}
program Clique;
const
maxN = 1000;
var

Sample Output
Number of guests: 4
Guests to be invited: 2, 3, 4, 6,

a: array[1..maxN, 1..maxN] of Boolean;


deg, count: array[1..maxN] of Integer;
n: Integer;
x, best: array[1..maxN] of Boolean;
k, kbest: Integer;
procedure Enter; //Nhp d liu v xy dng ma trn quan h A
var
m, i: Integer;
u, v: Integer;
begin
ReadLn(n, m);
FillChar(a, SizeOf(a), False);
for i := 1 to m do
begin
ReadLn(u, v);
a[u, v] := True;
a[v, u] := True;
end;
end;
procedure Init; //Kh i t o
var
u, v, temp: Integer;
i, j: Integer;
begin
Tr c h t tnh cc deg[1...n]: deg[i] = S ng i quen ng i i
FillDWord(deg[1], n, 0);
for u:= 1 to n do
for v := 1 + u to n do
if a[u, v] then
begin
Inc(deg[u]); Inc(deg[v]);
end;
//Kh i t o x v{ best l{ hai ph ng |n c s ng i c chn b ng 0
FillChar(x[1], n, False); k := 0;
FillChar(best[1], n, False); kbest := 0;
ng b mng count[1...n] vi ph ng |n x
FillDWord(count[1], n, 0);
end;
c l ng cn trn ca s ng i c th chn c da vo
function UpperBound(i: Integer): Integer;
var
j: Integer;
begin
Result := k;
for j := i to n do
if (deg[j] > kbest) and (count[j] >= k) then Inc(Result);
end;
procedure Attempt(i: Integer);
var
j: Integer;
begin
if UpperBound(i) <= kbest then Exit;

if i = n + 1 then
begin
best := x;
kbest := k;
Exit;
end;
if (count[i] >= k) and (deg[i] > kbest) then
begin
x[i] := True;
Inc(k);
for j := i + 1 to n do
if a[i, j] then Inc(count[j]);
Attempt(i + 1);
x[i] := False;
Dec(k);
for j := i + 1 to n do
if a[i, j] then Dec(count[j]);
end;
Attempt(i + 1);
end;
procedure PrintResult;
var
i: Integer;
begin
WriteLn('Number of guests: ', kbest);
Write('Guests to be invited: ');
for i := 1 to n do
if best[i] then Write(i, ', ');
WriteLn;
end;
begin
Enter;
Init;
Attempt(1);
PrintResult;
end.

1.4.3. Bi ton xp ba l
Bi ton xp ba l (Knapsack): Cho sn phm, sn phm th c trng lng l
v gi
(
). Cho mt bal c gii hn trng lng l , hy chn ra mt s sn
tr l
phm cho vo ba l sao cho tng trng lng ca chng khng vt qu

v tng gi tr

ca chng l ln nht c th.


Knapsack l mt bi ton ni ting v kh: Hin cha c mt li gii hiu qu cho nghim
ti u trong trng hp tng qut. Nhng c gng gii quyt bi ton Knapsack cho ra
i nhiu thut ton gn ng, hoc nhng thut ton ti u trong trng hp t bit
(chng hn thut ton quy hoch ng khi

l nhng s nguyn tng i nh).

Di y ta s xy dng thut ton quay lui v k thut nhnh cn gii bi ton


Knapsack.

M hnh duyt
C hai kh nng cho mi sn phm: chn hay khng chn. V vy mt cch chn cc sn
phm xp vo ba l tng ng vi mt dy nh phn di . Ta c th biu din nghim
(
) trong
ca bi ton di dng mt dy
nu nh sn phm
c c chn. M hnh duyt s c thit k tng t nh m hnh lit k cc dy nh
phn.
Lp hm cn bng cch chi sai lut
Gi s rng ta c th ly mt phn sn phm thay v ly ton b sn phm, tc l c th chia
nh mt sn phm v nh gi mi phn chia theo trng lng. Nu sn phm c gi tr
v trng lng

th khi ly mt phn c trng lng

, phn ny s c gi tr l

.
Vi lut chn c sa i nh vy, ta c th tin hnh mt thut ton tham lam tm
phng n ti u: Vi mi sn phm , gi t s gi tr/khi lng

l mt ca sn phm

. Sp xp cc sn phm theo th t gim dn ca mt v nh s li cc sn phm theo


th t sp xp:

Bt u vi mt ba l rng, xt ln lt cc sn phm t 1 ti . Mi khi xt ti sn phm ,


nu c th thm ton b sn phm m khng vt qu gii hn trng lng ca ba l th ta
s chn ton b sn phm , nu khng, ta s ly mt phn ca sn phm t va gii
hn trng lng ca ba l.
V d c 5 sn phm c sp xp gim dn theo mt :
1
2
1

2
2
2

3
2
3

4
2
4

5
2
5

Vi gii hn trng lng l 8, ta s ly nguyn sn phm 1, nguyn sn phm 2, nguyn


sn phm 3 v mt na sn phm 4. c ng trng lng 8 v gi tr ly c l

R rng phng n chn cc sn phm nh vy l sai lut (phi ly nguyn sn phm ch


khng c ly mt phn), nhng hy th xt li thut ton v gi tr ly c, ta c nhn
xt: Cho d phng n chn ng lut c tt nh th no chng na, tng gi tr cc sn
phm c chn khng th tt hn kt qu ca php chn sai lut.

Nhn xt trn gi cho ta vit mt hm


cc sn phm t

): c lng xem nu chn trong

ti

vi gii hn trng lng th tng gi tr thu c khng th vt


(
) c tnh bng php chn sai lut.
qu bao nhiu?. Gi tr hm
function UpperBound(k: Integer; m: Real): Real;
var
i: Integer;
q: Real;
begin
Result := 0;
for i := k to n do //Xt cc sn phm t k ti n
begin
if w[i] m then q := w[i] //Ly ton b sn phm
else q := m; //Ly mt phn sn phm cho va gii h n trng l ng
Result := Result + q / w[i] * v[i]; //Cp nht tng gi tr
m := m q; //Cp nht gii h n trng l ng mi
if m = 0 then Break;
end;
end;

Mi khi chun b ra quyt nh chn hay khng chn sn phm th , thut ton cn da
vo tng gi tr cc sn phm quyt nh chn trc v gi tr hm

c lng cn trn ca tng gi tr c th thu c. Nu thy khng cn c may tm ra


phng n tt hn phng n ang c ghi nhn, qu trnh quay lui s thc hin vic ta
nhnh: khng th chn trong cc sn phm t

ti

na bi nu mun tm ra phng n

tt hn, cn phi thay i cc quyt nh chn trn cc sn phm t 1 ti

nh gi tng quan gia cc phn t ca cu hnh


Vi mi sn phm, i khi ta khng cn phi th hai kh nng: chn/khng chn. Mt trong
nhng cch lm l da vo nhng quyt nh trn cc sn phm trc xc nh sm
nhng sn phm chc chn khng c chn.
Gi s trong s
4, sn phm
sn phm
phm

sn phm cho c hai sn phm: sn phm

c trng lng 1 v gi tr

c trng lng 2 v gi tr 3. R rng khi sp xp theo mt gim dn th


s ng trc sn phm

v sn phm

s c th trc, v khi nu sn

khng c chn th sau ny khng c l do g ta li chn sn phm .

Tng qut hn, ta s lp tc a quyt nh khng chn sn phm


khng chn sn phm (

) c

nu trc ta

Nhn xt ny cho ta thm mt tiu chun hn ch khng gian duyt. Tiu chun ny c
( ), (
): Cho bit c th no chn sn phm trong iu
th vit bng hm
kin ta quyt nh chn hay khng chn trn cc sn phm t 1 ti :

function Selectable(j, k: Integer): Boolean;


var
i: Integer;
begin
for i := 1 to j do
if not x[i] and (w[i] w[k]) and (v[i] v[k]) //Sn phm i kh ng c chn v i "khng ti hn" k
then Exit(False); //K t lun q chc chn kh ng c chn
Result := True;
end;

Hm

s c dng trong th tc quay lui, ng thi tch hp vo hm


c mt nh gi cn cht hn.

Ci t
Ta s ci t bi ton xp ba l vi khun dng Input/Output nh sau:
Input

Dng 1 cha s nguyn dng

v s thc dng

dng tip theo, dng th ghi hai s thc dng

cch nhau mt du cch

cch nhau mt du cch.

Output
Phng n chn cc sn phm c tng trng lng
Sample Input
5 14.0
9.0 12.0
6.0 8.0
1.0 10.0
5.0 6.0
4.0 5.0

Sample Output
Selected products:
- Product 3: Weight = 1.0; Value = 10.0
- Product 1: Weight = 9.0; Value = 12.0
- Product 5: Weight = 4.0; Value = 5.0
Total weight: 14.0
Total value : 27.0

KNAPSACK_BB.PAS Bi ton xp bal

{$MODE OBJFPC}
program Knapsack;
const
maxN = 100;
type
TObj = record //Thng tin v mt sn phm
w, v: Real; //Trng l ng v gi tr
id: Integer; //Ch s
end;
var
obj: array[1..maxN] of TObj;
x, best: array[1..maxN] of boolean;
SumW, SumV: Real;
MaxV: Real;
n: Integer;
m: Real;
procedure Enter; //Nhp d liu

v tng gi tr ln nht c th.

var
i: Integer;
begin
ReadLn(n, m);
for i := 1 to n do
with obj[i] do
begin
ReadLn(w, v);
id := i;
end;
end;
nh ngha to|n t: sn phm x < sn phm y n u mt x > mt y, ton t n{y dng sp x p
operator < (const x, y: TObj): Boolean;
begin
Result := x.v / x.w > y.v / y.w
end;
procedure Sort; //Thut ton sp x p kiu chn, x p cc sn phm gim dn theo mt
var
i, j: Integer;
temp: TObj;
begin
for i := 2 to n do
begin
temp := obj[i]; j := i - 1;
while (j > 0) and (temp < obj[j]) do
begin
obj[j + 1] := obj[j];
Dec(j);
end;
obj[j + 1] := temp;
end;
end;
procedure
begin
SumW :=
SumV :=
MaxV :=
end;

Init; //Kh i t o
0; //Mt ba l rng
0; //Tng gi tr cc phn t c chn
-1; //Tng gi tr thu c trong ph ng |n ti u best

|nh gi| xem c th chn sn phm k hay kh ng khi ~ quy t nh xong vi cc sn phm 1...j
function Selectable(j, k: Integer): Boolean;
var
i: Integer;
begin
for i := 1 to j do
if not x[i] and
(obj[i].w <= obj[k].w) and (obj[i].v >= obj[k].v) then
Exit(False); //Sn phm i ~ kh ng c chn v khng ti hn k, chc chn khng chn k
Result := True;
end;
c l ng gi tr cn trn ca php chn
function UpperBound(k: Integer; m: Real): Real;

var
i: Integer;
q: Real;
begin
Result := 0;
for i := k to n do
if Selectable(k - 1, i) then
begin
if obj[i].w <= m then q := obj[i].w //Ly ton b sn phm i
else q := m; //Ly mt phn sn phm i
Result := Result + q / obj[i].w * obj[i].v;
m := m - q;
if m = 0 then Break;
end;
end;
procedure Attempt(i: Integer); //Thut ton quay lui
begin
|nh gi| xem c n n th ti p khng, n u khng c hy vng tm ra nghim tt hn best th thot ngay
if SumV + UpperBound(i, m - SumW) <= MaxV then
Exit;
if i = n + 1 then
~ quy t nh xong vi n sn phm v{ tm ra ph ng |n x tt hn best
begin //Cp nht best, maxV v thot ngay
best := x;
MaxV :=SumV;
Exit;
end;
if (SumW + obj[i].w <= m) and Selectable(i - 1, i) then //Sn phm i c th chn
begin
x[i] := True; //Th chn sn phm i
SumW := SumW + obj[i].w; //Cp nht tng trng l ng ang c trong ba l
SumV := SumV + obj[i].v; //Cp nht tng gi tr ang c trong ba l
Attempt(i + 1); //Th sn phm k ti p
SumW := SumW - obj[i].w; //Sau khi th chn xong, b sn phm i khi ba l
SumV := SumV - obj[i].v; //phc hi SumW v{ SumV nh khi ch a chn sn phm i
end;
x[i] := False; //Th khng chn sn phm i
Attempt(i + 1); //th sn phm k ti p
end;
procedure PrintResult; //In k t qu
var
i: Integer;
TotalWeight: Real;
begin
WriteLn('Selected products: ');
TotalWeight := 0;
for i := 1 to n do
if best[i] then
with obj[i] do
begin
Write('- Product ', id, ': ');
WriteLn('Weight = ', w:1:1, '; Value = ', v:1:1);
TotalWeight := TotalWeight + w;
end;

WriteLn('Total weight: ', TotalWeight:1:1);


WriteLn('Total value : ', MaxV:1:1);
end;
begin
Enter; //Nhp d liu
Sort; //Sp x p theo chiu gim dn ca mt
Init; //Kh i t o
Attempt(1); //Kh i ng thut ton quay lui
PrintResult; //In k t qu
end.

1.4.4. Dy ABC
Cho trc mt s nguyn dng

, hy tm mt xu ch gm cc k t A, B, C

tho mn 3 iu kin:

C di .

Hai on con bt k lin nhau u khc nhau (on con l mt dy k t lin tip ca
xu).

C t k t C nht.

Thut ton 1: c lng hm cn


Ta s dng thut ton quay lui lit k cc dy
trong tp *

k t m mi phn t ca dy c chn

+. Gi s cu hnh cn lit k c dng

Nu dy

th:

tho mn 2 on con bt k lin nhau u khc nhau, th trong 4 k t lin

tip bt k bao gi cng phi c t nht mt k t C. Nh vy vi mt on gm


tip ca dy
th s k t C trong on lun
Sau khi th chn

+, nu ta c

k t C trong on

k t lin

, th cho d cc bc

chn tip sau lm tt nh th no chng na, s k t C phi chn thm khng bao gi t
hn

. Tc l nu theo phng n chn

nh th ny th s k t C trong dy kt qu

. Ta dng con s ny nh gi nhnh cn,

(khi chn n

) khng th t hn

nu n nhiu hn s k t C trong cu hnh tt nht ang cho ti thi im hin ti th chc


chn c lm tip cng ch c mt cu hnh ti t hn, ta b qua ngay cch chn ny v th
phng n khc.
Ti th v thy thut ton ny hot ng kh nhanh vi
tr

, tuy nhin vi nhng gi

th vn khng kin nhn i ra kt qu. Di y l mt thut ton khc

tt hn, i i vi n l mt chin lc chn hm cn kh hiu qu, khi m ta kh xc nh


hm cn tht cht bng cng thc tng minh.

Thut ton 2: Ly ngn nui di


, ta gi , - l s k t C trong xu c di tho mn hai on con bt
k lin nhau phi khc nhau v c t k t C nht. R rng , , ta s lp trnh tnh cc
, - trong iu kin cc ,
- bit.
Vi mi di

Tng t nh thut ton 1, gi s cu hnh cn tm c dng


nu ta c

th sau khi th chn

k t C trong on

, th cho d cc bc chn tip sau lm tt nh th


-, tc l nu chn
no chng na, s k t C phi chn thm khng bao gi t hn ,
tip th s k t C khng th t hn
quay lui tm xu ti u di

-. Ta dng cn ny kt hp vi thut ton

cng nh tnh gi tr , -

Nh vy ta phi thc hin thut ton

ln vi cc di xu

+, tuy nhin ln

thc hin sau s s dng nhng thng tin c ca ln thc hin trc lm mt hm cn
cht hn v thc hin trong thi gian chp nhn c.
Ci t
Input
S nguyn dng
Output
Xu ABC cn tm
Sample Input
10

Sample Output
Analyzing...
f[1] = 0
f[2] = 0
f[3] = 0
f[4] = 1
f[5] = 1
f[6] = 1
f[7] = 1
f[8] = 2
f[9] = 2
f[10] = 2
The best string of 10 letters is:
ABACABCBAB
Number of 'C' letters: 2

ABC_BB.PAS Dy ABC

{$MODE OBJFPC}
program ABC_STRING;
const
max = 1000;
modulus = 12345;
var
n, m, MinC, CountC: Integer;
Powers: array[0..max] of Integer;

f: array[0..max] of Integer;
x, Best: AnsiString;
procedure Init; //Vi mt di m <= n, kh i t o thut ton quay lui
var
i: Integer;
begin
SetLength(x, m);
MinC := m;
CountC := 0;
Powers[0] := 1;
for i := 1 to m do
Powers[i] := Powers[i - 1] * 3 mod modulus;
f[0] := 0;
end;
i k t c ra mt ch s trong h c s 3

function Code(c: Char): Integer;


begin
Result := Ord(c) - Ord('A');
end;
//Hm Same(i, l) cho bi t xu gm l k t k t thc t i x[i] c trng vi xu l k t lin tr c n khng ?

function Same(i, j, k: Integer): Boolean;


begin
while k <= i do
begin
if x[k] <> x[j] then
Exit(False);
Inc(k); Inc(j);
end;
Result := True;
end;

//Hm Check(i) cho bi t x[i] c lm hng tnh khng l p ca dy x[1..i] hay khng. Thut ton Rabin-Karp

function Check(i: Integer): Boolean;


var
j, k: Integer;
h: array[1..max] of Integer;
begin
h[i] := Code(x[i]);
for j := i - 1 downto 1 do
begin
h[j] := (Powers[i - j] * Code(x[j]) + h[j + 1]) mod modulus;
if odd(i - j) then
begin
k := i - (i - j) div 2;
if (h[k] * (Powers[k - j] + 1) mod modulus = h[j])
and Same(i, j, k) then
Exit(False);
end;
end;
Result := True;
end;
//Gi l i k t qu tt hm va tm c

procedure UpdateSolution;

begin
MinC := CountC;
if m = n then
Best := x;
end;
//Thut ton quay lui

procedure Attempt(i: Integer); //Th cc gi tr c th nhn ca X[i]


var
j: AnsiChar;
begin
for j := 'A' to 'C' do //Xt tt c cc kh nng
begin
x[i] := j; //Th t x[i]
if Check(i) then //n u gi tr v{o kh ng l{m hng tnh khng l p
begin
if j = 'C' then Inc(CountC); //Cp nht s k t C cho ti b c ny
if CountC + f[m - i] < MinC then
|nh gi| nh|nh cn
if i = m then UpdateSolution //Cp nht k t qu n u ~ n l t th cui
else Attempt(i + 1); Ch a n l t th cui th th ti p
if j = 'C' then Dec(CountC); //Phc hi s k t C nh c
end;
end;
end;
procedure PrintResult;
begin
WriteLn('The best string of ', n, ' letters is:');
WriteLn(Best);
WriteLn('Number of ''C'' letters: ', MinC);
end;
begin
ReadLn(n);
WriteLn('Analyzing...');
for m := 1 to n do
begin
Init;
Attempt(1);
f[m] := MinC;
WriteLn('f[', m, '] = ', f[m]);
end;
WriteLn;
PrintResult;
end.

1.4.5. Tm tt
Chng ta kho st k thut nhnh cn p dng trong thut ton quay lui gii quyt mt
s bi ton ti u. K thut ny cn c th p dng cho lp cc bi ton duyt ni chung
hn ch bt khng gian tm kim.
Khi ci t thut ton quay lui c nh gi nhnh cn, cn c:

Mt hm cn tt loi b sm nhng phng n chc chn khng phi nghim

Mt th t duyt tt nhanh chng i ti nghim ti u

C mt s trng hp m kh c th tm ra mt th t duyt tt th ta c th p dng mt


th t ngu nhin ca cc gi tr cho mi bc th v dng mt hm chn thi gian chp
nhn ngay phng n tt nht ang c sau mt khong thi gian nht nh v ngng qu
trnh th (v d 1 giy). Mt cch lm khc l ta s ch duyt ti mt su nht nh, sau
mt thut ton tham lam s c p dng tm ra mt nghim c th khng phi ti u
nhng tt mc chp nhn c. Chin lc ny c tn gi bduyt, totham.
Bi tp 1-1.
Hy lp chng trnh nhp vo hai s
*
+.

v , lit k cc chnh hp lp chp

ca tp

Bi tp 1-2.
Hy lit k cc dy nh phn di

m trong cm ch s 01 xut hin ng 2 ln.

Bi tp 1-3.
Nhp vo mt danh sch

tn ngi. Lit k tt c cc cch chn ra ng

ngi trong s

ngi .
Bi tp 1-4.
lit k tt c cc tp con ca tp *

+ ta c th dng phng php lit k tp con

nh trn hoc dng phng php lit k tt c cc dy nh phn. Mi s 1 trong dy nh


+ th dy nh
phn tng ng vi mt phn t c chn trong tp. V d vi tp *
phn 1010 s tng ng vi tp con * +. Hy lp chng trnh in ra tt c cc tp con ca
tp *

+ theo hai phng php.

Bi tp 1-5.
Cn xp

ngi mt bn trn, hai cch xp c gi l khc nhau nu tn ti hai ngi ngi

cnh nhau cch xp ny m khng ngi cnh nhau trong cch xp kia. Hy m v lit k
tt c cc cch xp.
Bi tp 1-6.
Ngi ta c th dng phng php sinh lit k cc chnh hp khng lp chp . Tuy
nhin c mt cch khc l lit k tt c cc tp con

phn t ca tp hp, sau in ra

hon v ca cc phn t trong mi tp hp. Hy vit chng trnh lit k cc chnh hp


+ theo c hai cch.
khng lp chp ca tp *
Bi tp 1-7.
Lit k tt c cc hon v ch ci trong t MISSISSIPPI theo th t t in.
Bi tp 1-8.
Cho hai s nguyn dng

. Hy lit k cc xu nh phn di

xu con no di lin nhau u khc nhau.

c tnh cht, bt k hai

Bi tp 1-9.
Vi
*

v cy tm kim quay lui ca chng trnh lit k t hp chp

ca tp

Bi tp 1-10.
Cho tp

gm

s nguyn, hy lit k tt c cc tp con

phn t ca tp

tha mn:

chnh lch v gi tr gia hai phn t bt k trong tp con khng vt qu ( cho trc)
Bi tp 1-11.
gi l mt hon v hon ton ca tp *

Mt dy
mn:
*

+ nu n l mt hon v tho

. Hy vit chng trnh lit k tt c cc hon v hon ton ca tp


+

Bi tp 1-12.
Lp trnh m s cch xp

qun hu ln bn c

sao cho khng qun no n qun

no.
Bi tp 1-13.
M i tun: Cho bn c tng qut kch thc

v mt qun M, hy ch ra mt hnh

trnh ca qun M xut pht t ang ng i qua tt c cc cn li ca bn c, mi


ng 1 ln.
Bi tp 1-14.
t s giao thng gm

nt giao thng nh s t 1 ti

on ng ni chng,

mi on ng ni 2 nt giao thng. Hy nhp d liu v mng li giao thng , nhp s


hiu hai nt giao thng

v . Hy in ra tt c cc cch i t

ti

m mi cch i khng

c qua nt giao thng no qu mt ln.


Bi tp 1-15.
Cho mt s nguyn dng

, hy tm mt hon v ca dy (

hai phn t lin tip ca dy l s nguyn t. V d vi

) sao cho tng

, ta c dy (

Bi tp 1-16.
Mt dy du ngoc hp l l mt dy cc k t ( v ) c nh ngha nh sau:

Dy rng l mt dy du ngoc hp l su 0
Nu l dy du ngoc hp l su th ( ) l dy du ngoc hp l su

Nu

l hai dy du ngoc hp l vi su ln lt l
(
)
ngoc hp l su l

di ca mt dy ngoc l tng s k t ( v )
V d: C 5 dy du ngoc hp l di 8 v su 3:
((()()))
((())())

th

l dy du

((()))()
(()(()))
()((()))
Bi ton t ra l khi cho bit trc hai s nguyn dng
lit k cc dy ngoc hp l c di l

. Hy

v su l . Trong trng hp c nhiu hn

100 dy th ch cn a ra 100 day nho nhat theo th t t ien.


Bi tp 1-17.
C

ngi th v

cng vic (

), mi th c kh nng lm mt s cng vic

no . Hy chn ra mt tp t nht nhng ngi th sao cho bt k cng vic no trong s


cng vic cho u c ngi lm c trong s nhng ngi chn.

Bi 2. Chia tr v gii thut quy


2.1. Chia tr
Ta ni mt i tng l quy nu n c nh ngha qua mt i tng khc cng dng
vi chnh n.
V d: t hai chic gng cu i din nhau. Trong chic gng th nht cha hnh
chic gng th hai. Chic gng th hai li cha hnh chic gng th nht nn tt
nhin n cha li hnh nh ca chnh n trong chic gng th nht mt gc nhn
hp l, ta c th thy mt dy nh v hn ca c hai chic gng.
Mt v d khc l nu ngi ta pht hnh trc tip pht thanh vin ngi bn my v
tuyn truyn hnh, trn mn hnh ca my ny li c chnh hnh nh ca pht thanh vin
ngi bn my v tuyn truyn hnh v c nh th
Trong ton hc, ta cng hay gp cc nh ngha quy:

Giai tha ca

K hiu s phn t ca mt tp hp hu hn l | |: Nu
* +|
th tt c mt phn t
, khi | | |

( ): Nu

th

; nu

th

th | |

; Nu

. y l phng

php nh ngha tp cc s t nhin.

Ta ni mt bi ton

mang bn cht quy nu li gii ca mt bi ton

hin bng li gii ca cc bi ton

c th c thc

c dng ging nh . Mi nghe th c v hi l

nhng im mu cht cn lu l:

tuy c dng ging nh , nhng theo mt

ngha no , chng phi nh hn , d gii hn

v vic gii chng khng cn dng n

.
Chia tr (divide and conquer) l mt phng php thit k gii thut cho cc bi ton
mang bn cht quy: gii mt bi ton ln, ta phn r n thnh nhng bi ton con
ng dng, v c tin hnh phn r cho ti khi nhng bi ton con nh c th gii trc
tip. Sau nhng nghim ca cc bi ton con ny s c phi hp li c nghim
ca bi ton ln hn cho ti khi c c nghim bi ton ban u.
Khi no mt bi ton c th tm c thut gii bng phng php chia tr?. C th tm
thy cu tr li qua vic gii p cc cu hi sau:

C th nh ngha c bi ton di dng phi hp ca nhng bi ton cng loi


nhng nh hn hay khng ? Khi nim nh hn l th no ? ( c nh quy tc phn r
bi ton)

Trng hp c bit no ca bi ton c th coi l nh c th gii trc tip c?


( c nh cc bi ton c s)

2.2. Gii thut quy


Cc gii thut quy l hnh nh trc quan nht ca phng php chia tr. Trong cc
ngn ng lp trnh cu trc, cc gii thut quy thng c ci t bng cc chng
trnh con quy. Mt chng trnh con quy gm hai phn:

Phn neo (anchor): Phn ny c thc hin khi m cng vic qu n gin, c th gii
trc tip ch khng cn phi nh n mt bi ton con no c.

Phn quy (recursion): Trong trng hp bi ton cha th gii c bng phn neo,
ta xc nh nhng bi ton con v gi quy gii nhng bi ton con . Khi c li
gii (p s) ca nhng bi ton con ri th phi hp chng li gii bi ton ang
quan tm.

Phn quy m phng qu trnh phn r bi ton theo nguyn l chia tr. Phn neo
tng ng vi nhng bi ton con nh c th gii trc tip c, n quyt nh tnh hu
hn dng ca li gii.
Sau y l mt vi v d v gii thut quy.

2.2.1. Tnh giai tha


nh ngha giai tha ca mt s t nhin , k hiu

, l tch ca cc s nguyn dng t 1

ti :

Hon ton c th s dng mt thut ton lp tnh , tuy nhin nu chng ta th ngh mt
(
) nn tnh (bi ton ln) ta i tnh (
) (bi
theo mt cch khc: V
ton con) ri ly kt qu nhn vi .
Cch ngh ny cho ta mt nh ngha quy np ca hm giai tha, bi ton tnh giai tha ca
mt s c a v bi ton tnh giai tha ca mt s khc nh hn.
function Factorial(n: Integer): Integer; //Nhn vo s t nhin n v tr v n!
begin
if n = 0 then Result := 1 //Phn neo
else Result := n * Factorial(n - 1); //Phn quy
end;

y, phn neo nh ngha kt qu hm ti


ngha kt qu hm qua gi tr ca

, cn phn quy (ng vi

v giai tha ca

V d: Dng hm ny tnh

) s nh

2.2.2. i c s
biu din mt gi tr s

trong h nh phn:
*

ch s nh phn

( ) , ta cn tm dy cc

+ :

C nhiu thut ton lp tm biu din nh phn ca , tuy nhin chng ta c th s dng
phng php chia tr thit k mt gii thut quy kh ngn gn.
Ta c nhn xt l
v nu loi b

(ch s hng n v) chnh bng s d ca php chia


khi biu din nh phn ca
(

Vy tm biu din nh phn ca


, biu din nh phn ca

ta s c s:
)

(bi ton ln), ta c th tm biu din nh phn ca s

(bi ton nh) ri vit thm gi tr


hay

cho 2 (

chnh l

vo sau biu din . Ngoi ra khi


nn c th coi y l nhng bi ton nh

c th gii trc tip c. Ton b thut ton c th vit bng mt th tc quy


( ) nh sau:
procedure Convert(x: Integer);
begin
if x 2 then Convert(x div 2);
Output x mod 2;
end;

2.2.3. Dy s Fibonacci
Dy s Fibonacci bt ngun t bi ton c v vic sinh sn ca cc cp th. Bi ton t ra
nh sau:

Cc con th khng bao gi cht

Hai thng sau khi ra i, mi cp th mi s sinh ra mt cp th con (mt c, mt ci)

Khi sinh con ri th c mi thng tip theo chng li sinh c mt cp con mi

Gi s t u thng 1 c mt cp mi ra i th n gia thng th


V d,

, ta thy:

Gia thng th 1: 1 cp (ab) (cp ban u)

s c bao nhiu cp.

Gia thng th 2: 1 cp (ab) (cp ban u vn cha )


Gia thng th 3: 2 cp (AB)(cd) (cp ban u ra thm 1 cp con)
Gia thng th 4: 3 cp (AB)(cd)(ef) (cp ban u tip tc )
Gia thng th 5: 5 cp (AB)(CD)(ef)(gh)(ik) (c cp (AB) v (CD) cng )

By gi, ta xt ti vic tnh s cp th thng th : ( ). Nu ta ang thng


s th thng

v tnh

th:
S thng ti = S hin c + S c sinh ra trong thng ti

Mt khc, vi tt c cc cp th

thng tui th sang thng sau, chng u

thng tui v

u s sinh. Tc l:
S c sinh ra trong thng ti = S thng trc
Vy:
S thng ti = S hin c + S thng trc
( )

Vy c th tnh c ( ) theo cng thc sau:


( )

e
(

) e

function f(n: Integer): Integer; //Tnh s c p th thng th n


begin
if n 2 then Result := 1 //Phn neo
else Result := f(n - 1) + f(n - 2); //Phn quy
end;

2.3. Hiu lc ca chia tr v quy


Chia tr l mt cch thc tip cn bi ton. C rt nhiu bi ton quen thuc c th gii
bng quy thay v li gii lp nh cch tip cn ny. Ngoi nhng bi ton k trn, c th
a ra mt s v d khc:

Bi ton tm gi tr ln nht trong mt dy s: tm gi tr ln nht ca dy


(
), nu dy ch c mt phn t th chnh l gi tr ln nht, nu khng ta
tm gi tr ln nht ca dy gm phn t u v gi tr ln nht ca dy gm
phn t cui, sau chn ra gi tr ln nht trong hai gi tr ny. Phng php
ny t ra thch hp khi ci t thut ton trn cc my song song: Vic tm gi tr ln
nht trong hai na dy s c thc hin c lp v ng thi trn hai b x l khc
nhau, lm gim thi gian thc hin trn my. Tng t nh vy, thut ton tm kim
tun t cng c th vit bng quy.

Thut ton tm kim nh phn cng c th vit bng quy: a vic tm kim mt gi
tr trn dy sp xp v vic tm kim gi tr trn mt dy con c di bng mt
na.

Thut ton QuickSort c m hnh chun vit bng quy, nhng khng ch c
QuickSort, mt lot cc thut ton sp xp khc cng c th ci t bng quy, v d
thut ton Merge Sort: sp xp mt dy kha, ta s sp xp ring dy cc phn t
mang ch s l v dy cc phn t mang ch s chn ri trn chng li. Hay thut ton
Insertion Sort: sp xp mt dy kha, ta ly ra mt phn t bt k, sp xp cc phn

t cn li v chn phn t ly ra vo v tr ng ca n
) ta ly ln lt tng phn t trong dy ra
lit k cc hon v ca dy s (
) hon v ca cc phn t cn li.
ghp vi (

Cn phi nhn mnh rng phng php chia tr l mt cch tip cn bi ton v tm li
gii quy, nhng nguyn l ny cn ng vai tr ch o trong vic thit k nhiu thut
ton khc na.
Ngoi ra, khng c lm dng chia tr v quy. C nhng trng hp li gii quy t
ra ngn gn v hiu qu (v d nh m hnh ci t thut ton QuickSort) nhng cng c
nhng trng hp gii thut quy khng nhanh hn hay n gin hn gii thut lp (tnh
giai tha); thm ch cn c nhng trng hp m lm dng quy s lm phc tp ha vn
, ko theo mt qu trnh tnh ton cng knh nh gii thut tnh s Fibonacci trn (c
th chng minh bng quy np l s php cng trong gii thut quy tnh s Fibonacci
th ng bng ( )
trong khi gii thut lp ch cn khng qu php cng).
V bi ton gii bng phng php chia tr mang bn cht quy nn chng minh tnh
ng n v phn tch thi gian thc hin gii thut, ngi ta thng s dng cc cng c
quy np ton hc. Ni ring v vic phn tch thi gian thc hin gii thut, cn c mt cng
c rt mnh l Error! Reference source not found..
Gi s rng ta c mt bi ton kch thc

v mt thut ton chia tr. Gi ( ) l thi

gian thc hin gii thut . Nu thut ton phn r bi ton ln ra thnh bi ton con,
mi bi ton con c kch thc , sau gii c lp bi ton con v phi hp nghim
li th thi gian thc hin gii thut s l
( )

( )

( )

y ta k hiu ( ) l thi gian phn r bi ton ln, phi hp nghim ca cc bi ton


conni chung l cc chi ph thi gian khc ngoi vic gii cc bi ton con.
nh l Master ni rng nu

, ( c th l hay khng quan

trng), khi :

Nu ( )

Nu ( )

Nu ( )

vi mi gi tr

) vi hng s
) th ( )

, th ( )

) vi hng s
ln th ( )

( ( ))

)
v

( )

( ) vi hng s

Tuy vic chng minh nh l ny kh phc tp nhng chng ta cn phi nh p dng


c nhanh. Ta s xt tip mt vi bi ton kinh in p dng phng php chia tr v
quy

2.3.1. Tnh ly tha


Bi ton t ra l cho hai s nguyn dng

. Hy tnh gi tr

Thut ton 1
Ta c th tnh trc tip bng thut ton lp*: Vit mt hm

) tnh

function Power(x, n: Integer): Integer;


var
i: Integer;
begin
Result := 1;
for i := 1 to n do Result := Result * x;
end;

Nu coi php nhn (*) l php ton tch cc th c th thy rng thut ton tnh trc tip ny
cn php nhn. Vy thi gian thc hin gii thut l ( ).
Thut ton 2
Xt mt thut ton chia tr da vo tnh cht sau ca
{

e
e

function Power(x, n: Integer): Integer;


begin
if n = 0 then Result := 1
else Result := x * Power(x, n 1);
end;

Bi ton tnh

c a v bi ton tnh

thut, thut ton cn thc hin tt c


hin cng l ( ).

nu

. Xt v thi gian thc hin gii

php nhn (php ton tch cc) nn thi gian thc

Thut ton ny khng c ci thin no v tc , li tn b nh hn (b nh cha tham s


truyn cho chng trnh con khi gi quy).

( ( )
)
Mt s cng c lp trnh c cung cp sn hm m. Nh trong Free Pascal, ta c th tnh
(
) hoc
(
). Tuy nhin cch lm ny c hn

hay s dng th vin Math dng cc hm

ch l khng th ty bin c nu chng ta thc hin tnh ton trn s ln, khi m kt qu
din bng mng hoc xu k t

buc phi biu

Thut ton 3
Ta xt mt thut ton chia tr khc:
e

{(

e
)

va

chan

va

le

function Power(x, n: Integer): Integer;


begin
if n = 0 then Result := 1
else
begin
Result := Power(x, n div 2);
Result := Result * Result;
if n mod 2 = 1 then Result := Result * x;
end;
end;

Vic tnh

c quy v vic tnh

ri em kt qu bnh phng ln (thm 1 php

nhn), sau gi nguyn kt qu hoc nhn thm kt qu vi

ty theo

chn hay

l.

(
) th ngoi lnh gi quy, cc lnh khc
Nu gi ( ) l thi gian thc hin hm
(
) tuy c tng thi gian thc hin khng phi l hng s nhng b chn (trn
trong hm
v di) bi hng s. Vy:
( )

( )

( )

p dng Error! Reference source not found. (trng hp 2), ta c ( )


th ba t ra nhanh hn hai thut ton trc. V d c th, tnh

). Thut ton

, chng ta ch mt 6 php

nhn so vi 12 php nhn ca hai cch tnh trc.

2.3.2. Thp H Ni
Bi ton
y l mt bi ton mang tnh cht mt tr chi, tng truyn rng ti ngi n Benares c
ba ci cc kim cng. Khi khai sinh ra th gii, thng t 64 ci a bng vng chng ln
nhau theo th t gim dn ca ng knh tnh t di ln, a to nht c t trn mt
chic cc.

Hnh 2-1. Thp H Ni

Cc nh s ln lt chuyn cc a sang cc khc theo lut:

Khi di chuyn mt a, phi t n vo v tr mt trong ba cc cho

Mi ln ch c th chuyn mt a v phi l a trn cng ca chng a

Ti mt v tr, a no mi chuyn n s phi t ln trn cng

a ln hn khng bao gi c php t ln trn a nh hn (hay ni cch khc: mt


a ch c t trn cc hoc t trn mt a ln hn)

Ngy tn th s n khi ton b chng a c chuyn sang mt cc khc.


Trong trng hp c 2 a, cch lm c th m t nh sau: Chuyn a nh sang cc 3, a
ln sang cc 2 ri chuyn a nh t cc 3 sang cc 2.
Nhng ngi mi bt u c th gii quyt bi ton mt cch d dng khi s a l t, nhng
h s gp rt nhiu kh khn khi s cc a nhiu hn. Tuy nhin, vi t duy quy np ton
hc v mt my tnh th cng vic tr nn kh d dng:
Thut ton chia tr
Gi s chng ta c
Nu

a.

th ta chuyn a duy nht t cc 1 sang cc 2 l xong.

Nu ta c phng php chuyn c


chuyn
a t cc sang cc (

a t cc 1 sang cc 2, th tng qut, cch


) cng tng t.

Gi s rng ta c phng php chuyn c


t cc sang cc , ta gi cc cn li l (
a cn li t cc

a gia hai cc bt k. chuyn a


). Coi a to nht l cc, chuyn

sang cc , sau chuyn a to nht sang cc

coi a to nht l cc, chuyn

a cn li ang cc

sang cc

v cui cng li
chng ln a to

nht.
Nh vy chuyn

a (bi ton ln), ta quy v hai php chuyn

a (bi ton nh)

v mt php chuyn 1 a (bi ton c s). Cch lm c th hin trong th tc quy


di y:

procedure Move(n, x, y: Integer); //Th tc chuyn n a t cc x sang cc y


begin
if n = 1 then
Output Chuyn 1 a t x sang y
else
chuyn n > a t cc x sang cc y, ta chia l{m 3 c ng o n
begin
Move(n - 1, x, 6 - x - y); //Chuyn n - a t cc x sang cc trung gian
Move(1, x, y); //Chuyn a to nht t x sang y
Move(n - 1, 6 - x - y, y); //Chuyn n - a t cc trung gian sang cc y
end;
end;

Vic chuyn

a by gi tr nn rt n gin qua mt lnh gi

C th chng minh s php chuyn a gii bi ton Thp H Ni vi

)
a l

bng

quy np:
R rng l tnh cht ny ng vi

, bi ta cn

php chuyn thc hin yu

cu.
Vi

; gi s (quy np) rng chuyn

chuyn, khi chuyn

a t cc

a gia hai cc ta cn

php

sang cc , nhn vo gii thut quy ta c th thy

rng trong trng hp ny n cn (

php chuyn. Tnh

cht c chng minh ng vi .


Vy th cng thc ny s ng vi mi .

2.3.3. Nhn a thc


Bi ton
Cho hai a thc
( )

( ) ( )

( )

( )

. Bi ton t ra l tm a thc

Mt a thc hon ton xc nh nu ta bit c gi tr cc h s ca n. Nh trong bi ton


ny, cng vic chnh l i tm cc gi tr

Phng php tnh trc tip


tm a thc ( ) mt cch trc tip, c th s dng thut ton sau:
for k := 0 to m + n do c[k] := 0; //Kh i t o cc h s a thc C b ng 0
//Xt mi c p h s a[i], b[j], cng dn tch a[i] * b[j] vo c[i + j]

for i := 0 to m do
for j := 0 to n do
c[i + j] := c[i + j] + a[i] * b[j];

D thy rng thi gian thc hin gii thut nhn a thc trc tip l (

). Di y chng

ta s tip cn bi ton theo phng php chia tr v gii thiu mt thut ton mi.

Thut ton chia tr


a thc ( ) c bc

v a thc ( ) c bc . Nu mt trong hai a thc ny c bc 0 th

bi ton tr thnh nhn mt a thc vi mt s, c th coi y l trng hp n gin v c


th tnh trc tip c. Nu hai a thc ny u c bc ln hn 0, khng gim tnh tng
qut, ta c th coi bc ca hai a thc ny bng nhau v l s l, bi v vic tng bc ca mt
a thc v gn h s bc cao nht ca n bng 0 khng lm nh hng ti kt qu tnh tch
hai a thc.
By gi ta c hai a thc ( ) v ( ) cng bc
( )

:
( )

t a thc ( ):
( )

(2.1)

( )

( )

Vy nu chia dy h s ca ( ) lm hai na bng nhau, na nhng h s cao tng ng vi


mt a thc ( ), v na nhng h s thp tng ng vi mt a thc ( ). Th ( ) v
( ) ln lt l thng v d ca php chia a thc ( ) cho
( )

( )

( )

(2.2)

( )

(2.3)

Tng t nh vy ta c th phn tch ( ) thnh:


( )
Cc a thc
( ) ( )

( ),
.

( ),
( )

( ) v

( )

( ) u l a thc bc

( )/ .

( ( )

( ))

( )

( )/

( ( ) ( )

( )

. Xt tch ( ) ( ):

( )

( ))

( ) ( )

(2.4)

( )

( )

tnh ( ) ( ), ta quy v vic tm ba a thc ( ) ( ) ( ). Vic tnh ( ) cng nh


( ), u cn mt php nhn a thc bc
. Sau khi tnh c ( ) v ( ) th ( )
cng c th tnh m ch dng mt php nhn a thc bc
Dng mt php nhn a thc bc
( )

theo cch:

tnh:

( )

( ))(

( )

( ))

(2.5)

Sau tnh
( )

( )

( )

( )

(2.6)

Bn c th kim chng ng thc ( )

( )

( )

( ) suy ra tnh ng n ca

cng thc tnh.


Xt cng thc (2.4), nu gi ( ) l thi gian thc hin php nhn hai a thc bc

th c

th nhn thy rng ngoi thi gian thc hin ba php nhn a thc k trn, cc php ton
khc (tnh tng a thc, nhn a thc vi n thc) c thi gian thc hin ( ). Vy
( )

( )

( )

p dng Error! Reference source not found., trng hp 1, ta c


(

(2.7)
( )

iu ny ch ra rng thut ton chia tr t ra tt hn thut ton tnh trc tip.


Ci t
Chng ta s ci t thut ton nhn hai a thc ( )
( )
vi khun dng nhp xut d liu nh sau:
(
)
Input

Dng 1 cha hai s t nhin

Dng 2 cha

s thc

Dng 3 cha

s thc

ln lt l bc ca a thc ( ) v a thc ( )
l cc h s ca ( )
l cc h s ca ( )

Output
Cc h s ca a thc ( ) t h s bc cao nht n h s bc thp nht
Sample Input
1 2
2.0 1.0
1.0 2.0 3.0

Sample Output
2.0 5.0 8.0 3.0

( )
( )
( )

POLYNOMIALMULTIPLICATION_DC.PAS Nhn a thc

{$MODE OBJFPC}
program PolynomialMultipication;
uses Math;
type
TPolynomial = array of Real;
a thc c biu din b ng mng ng cc h s
var
a, b, c: TPolynomial;
m, n: Integer;
//N u hai a thc p, q khc bc, thm vi h ng t bc cao nht c h s 0 bc ca chng b ng nhau
procedure Equalize(var p, q: TPolynomial);
var
lenP, lenQ, len: Integer;
begin
lenP := Length(p);
lenQ := Length(q);
len := Max(lenP, lenQ);

SetLength(p, len);
SetLength(q, len);
if lenP < len then //p b tng bc
FillChar(p[lenP], (len - lenP) * SizeOf(Real), 0);
if lenQ < Length(q) then //q b tng bc
FillChar(q[lenQ], (len - lenQ) * SizeOf(Real), 0);
end;

t p[lenP...len - 1] := 0
t q[lenQ...len 1] := 0;

procedure Enter; //Nhp d liu


var
i: Integer;
begin
ReadLn(m, n);
SetLength(a, m + 1);
SetLength(b, n + 1);
for i := m downto 0 do Read(a[i]);
ReadLn;
for i := n downto 0 do Read(b[i]);
Equalize(a, b); //Lm bc ca hai a thc b ng nhau
end;
a thc p c bc len - c ph}n ra l{m hai a thc pL, pH

procedure DivMod(const p: TPolynomial; out pL, pH: TPolynomial);


var
len, sublen: Integer;
begin
len := Length(p); //len l s h s ca p
sublen := (len + 1) div 2; //Tnh sublen = Ceil(len / 2)
pL := Copy(p, 0, sublen);
a phn h s thp sang pL
pH := Copy(p, sublen, len - sublen);
a phn h s cao sang pH
Equalize(pL, pH); //N u len l, pH c th c bc nh hn pL l{m cho ch ng cng bc
end;
nh ngha to|n t g|n g|n a thc b ng mt s thc v

operator := (v: Real): TPolynomial;


begin
SetLength(Result, 1);
Result[0] := v;
end;
//Tnh tng hai a thc

operator +(const a, b: TPolynomial): TPolynomial;


var
i: Integer;
begin
SetLength(Result, Length(a));
for i := 0 to High(Result) do
Result[i] := a[i] + b[i];
end;
//Tnh hiu hai a thc

operator -(const a, b: TPolynomial): TPolynomial;


var
i: Integer;
begin
SetLength(Result, Length(a));
for i := 0 to High(Result) do

Result[i] := a[i] - b[i];


end;
Tnh tch hai a thc

operator *(const a, b: TPolynomial): TPolynomial;


var
aH, aL, bH, bL: TPolynomial;
P, Q, R: TPolynomial;
i, k: Integer;
begin
if High(a) = 0 then Tr ng hp c s Hai a thc bc 0
begin
Result := a[0] * b[0];
Exit;
end;
//Tch mi a thc th{nh a thc

DivMod(a, aL, aH);


DivMod(b, bL, bH);
k := Length(aH);
P := aH * bH;
Q := aL * bL;
R := (aH + aL) * (bH + bL) - (aH * bH + aL * bL);
P, Q, R u c bc 2k - 2, K t qua c bc = 4k - 2

SetLength(Result, 4 * k - 1);

Tr c h t cng P * x^ k v{o Result in cc h s ca P vo Result[2k...4k - 2]

for i := 0 to High(P) do
Result[i + 2 * k] := P[i];

//Ti p theo cng Q v{o Result in cc h s ca Q vo Result[0...2k - 2]

for i := 0 to High(Q) do
Result[i] := Q[i];
Result[2 * k - 1] := 0; //Cn duy nht mt h s ca Result ch a kh i t o, t = 0
//Cui cng cng R * x^k vo Result

for i := 0 to High(R) do
Result[i + k] := Result[i + k] + R[i];
end;
procedure PrintResult;
var
i, d: Integer;
begin
//Lo i b nhng h ng t cao nht b ng 0 t a thc k t qu

d := High(c);
while (d > 0) and (c[d] = 0) do Dec(d);
SetLength(c, d + 1);
//In k t qu

for i := High(c) downto 0 do Write(c[i]:1:1, ' ');


WriteLn;
end;
begin
Enter;
c := a * b;
PrintResult;
end.

Bi tp 2-1.
Khi phi lm vic vi cc s ln vt qu phm vi biu din ca cc kiu d liu chun,

ngi ta c th biu din cc s ln bng mng cc ch s:


(

), v ci t cc php ton s hc trn s ln thc hin cc php ton ny

nh vi cc kiu d liu chun. Thut ton nhn hai s ln [12] c cch lm tng t nh
thut ton nhn hai a thc. Hy ci t thut ton ny nhn hai s ln.
Bi tp 2-2.
Cho mt bng vung kch thc

vung n v, trn ta b i mt . Hy tm

cch lt kn cc cn li ca bng bng cc mnh ghp dng

sao cho khng c hai mnh

no chng nhau. V d vi

Bi tp 2-3.
Xt php nhn hai ma trn

c ma trn
(

Ma trn

:
)

c th tnh trc tip bng thut ton:

for i := 1 to m do
for k := 1 to p do
begin
c[i, k] := 0;
for j := 1 to n do c[i, k] := c[i, k] + a[i, j] * b[j, k];
end;

Thut ton tnh trc tip c thi gian thc hin (

).

Xt thut ton chia tr: Thm nhng hng 0 v ct 0 vo ma trn ba ma trn

u c

kch thc

. Chia mi ma trn lm 4 phn bng nhau, mi phn l mt ma trn con kch

thc

:
[

khi nu

th:
(

tnh ma trn

theo cch ny, chng ta cn 8 php nhn ma trn con. Nu t kch thc

ca mi ma trn l

th thi gian thc hin gii thut c th biu din bng hm:
( )

( )

p dng Error! Reference source not found., trng hp 1, ta c ( )

), khng c

g tt hn thut ton tnh trc tip.


Tuy nhin cc ma trn con

c th tnh ch cn 7 php nhn ma trn

con bng thut ton Strassen [18]. Cc php nhn ma trn con cn thc hin l:
(

)(

(
(

)(

)(

Khi :
(

Xt v thi gian thc hin gii thut Strassen, ta c:


( )

( )

p dng Error! Reference source not found., trng hp 1, ta c


(

( )

).

Hy ci t thut ton Strassen tnh tch hai ma trn.


T c thm v thut ton Coppersmith-Winograd [4], hin ang l thut ton nhanh nht
hin nay nhn hai ma trn trong thi gian (

Bi tp 2-4.
Trn mt phng cho

hnh trn, hy tnh din tch min mt phng b

hnh trn ny chim

ch.
Gi : Ta c th coi cc hnh trn cho khng trng nhau. t mt hnh ch nht
c cc hnh trn, ta cn tnh phn din tch ca

b cc hnh trn chim ch. Nu

vi ch mt hnh trn, ta ch cn o din tch phn giao. Nu

cha tt
c giao

c giao vi nhiu hn mt

hnh trn, ta chia

lm bn hnh ch nht con bn gc v tnh tng din tch phn giao

ca bn hnh ch nht con ny vi cc hnh trn bng quy.


Bi tp 2-5. (Cp im gn nht)
Trn mt phng vi h ta trc chun
cho
(
) (
)
(
). Hy tm hai im gn nhau nht.
(

Khong cch gia hai im

) v

im phn bit:

) l khong cch Euclid:

tm cp im gn nht, chng ta c thut ton (

)
): th tt c cc b i v o khong

cch. Tuy nhin c mt thut ton tt hn da trn chin lc chia tr:

Phn hoch tp cc im lm hai tp ri nhau v , mt tp gm im v mt


tp gm im tha mn: Mi im thuc
u c honh mi im thuc
. iu ny c th thc hin bng cch tm mt ng thng song song vi trc tung,
t ti honh l trung v ca cc honh , cc im nm bn tri a vo
im nm bn phi vo

, cn cc im nm trn s c chia vo

, cc
gi

cho lc lng ca hai tp hn km nhau khng qu 1.

Ln lt gii bi ton tm cp im gn nht trn


khong cch ngn nht tm c trn hai tp. t

Nhn xt rng nu trong

, gi
).

ln lt l

im cho c mt cp im c khong cch ngn hn

hai im phi c mt im thuc


nm trong mt di

v
(

v mt im thuc

th

. Tc l c hai im phi

gii hn bi hai ng thng song song cch

mt khong

(Hnh 2-2). Vic cn li l tm cp im gn nht trong di ny v cc tiu ha

nu cp

im tm c c khong cch ngn hn cp im ang c.

Hnh 2-2. Thut ton chia tr tm cp im gn nht

D thy rng hai im c khong cch nh hn

th iu kin cn l chnh lch tung

gia hai im phi nh hn .


Hy chng minh rng nu
tung nh hn

so vi .

th c khng qu 8 im khc thuc

c chnh lch

Hy ch ra rng nu ban u cc im c sp xp theo th t tng dn ca tung th c


th tm thut ton ( ) tm cp im gn nht trong nu cp im c khong cch
nh hn . (gi : chi u c|c im ca

ln trc tung, vi mi im, t nh chi u ca n xt 8

nh ln cn v{ o khong cch t im ang xt ti 8 im t ng ng).


Hy tm thut ton

) v lp trnh thut ton gii bi ton tm cp im gn

nht trong khng gian hai chiu.


Hy tm thut ton ( (
Euclid

chiu.

) gii bi ton tm cp im gn nht trong khng gian

Bi 3. Quy hoch ng
Trong khoa hc tnh ton, quy hoch ng l mt phng php hiu qu gii cc bi ton
ti u mang bn cht quy.
Tn gi Quy ho ch ng (Dynamic Programming) c Richard Bellman xut vo
nhng nm 1940 m t mt phng php gii cc bi ton m ngi gii cn a ra ln
lt mt lot cc quyt nh ti u. Ti nm 1953, Bellman chnh li tn gi ny theo ngha
mi v a ra nguyn l gii quyt cc bi ton bng phng php quy hoch ng.
Khng c mt thut ton tng qut gii tt c cc bi ton quy hoch ng. Mc ch ca
bi ny l cung cp mt cch tip cn mi trong vic gii quyt cc bi ton ti u mang bn
cht quy, ng thi a ra cc v d ngi c hnh thnh cc k nng trong vic tip
cn v gii quyt cc bi ton quy hoch ng.

3.1. Cng thc truy hi


3.1.1. Bi ton v d
Chng ta s tm hiu v cng thc truy hi v phng php gii cng thc truy hi qua mt
v d:
Cho s t nhin

. Hy cho bit c bao nhiu cch phn tch s

thnh tng ca dy

cc s nguyn dng, cc cch phn tch l hon v ca nhau ch tnh l mt cch.


V d:

c 7 cch phn tch:

1. 5 = 1 + 1 + 1 + 1 + 1
2. 5 = 1 + 1 + 1 + 2
3. 5 = 1 + 1 + 3
4. 5 = 1 + 2 + 2
5. 5 = 1 + 4
6. 5 = 2 + 3
7. 5 = 5
Ta coi trng hp

cng c 1 cch phn tch thnh tng cc s nguyn dng (0 l

tng ca dy rng)
gii bi ton ny, mc 1.3.5 gii thiu phng php lit k tt c cc cch phn tch v
m s cu hnh. By gi hy th ngh xem, c cch no tnh ngay ra s l ng cc cch phn
tch m khng cn phi lit k hay khng. Bi v khi s cch phn tch tng i ln, phng
php lit k t ra kh chm. (v d ch vi

c 190.569.292 cch phn tch).

3.1.2. t cng thc truy hi


Nu gi ,

- l s cch phn tch s

cch phn tch s

thnh tng mt dy cc s nguyn dng

Loi 1: Khng cha s

c th chia lm hai loi:

thnh tng cc s nguyn dng

Loi 2: C cha t nht mt s


tch loi ny ta b i s
s nguyn dng
,
-

. Khi cc

trong php phn tch, khi s cch phn tch loi ny chnh

l s cch phn tch s


,
-.

thnh tng cc s nguyn dng

, tc l bng

trong php phn tch. Khi nu trong cc cch phn

th ta s c cc cch phn tch s

thnh tng cc

. C ngha l v mt s lng, s cc cch phn tch loi ny bng

Trong trng hp

th r rng ch c cc cch phn tch loi 1, cn trong trng hp

th s c c cc cch phn tch loi 1 v loi 2. V th:


,

,
,

Ta c cng thc xy dng ,

- t ,

- v ,

(3.1)
-. Cng thc ny c tn gi l

cng thc truy hi (recurrence) a vic tnh ,

- v vic tnh cc ,
- vi d liu
-: S cc cch phn tch thnh tng
nh hn. Tt nhin cui cng ta s quan tm n ,
cc s nguyn dng
V d vi

, cc gi tr ,

- c th cho bi bng:
0
1
2
3
4
5

0
1
1
1
1
1
1

1
0
1
1
1
1
1

2
0
1
2
2
2
2

3
0
1
2
3
3
3

4
0
1
3
4
5
5

5
0
1
3
5
6
7

- c tnh qua gi tr ca mt phn t hng trn


T cng thc tnh, ta thy rng ,
-) v mt phn t cng hng, bn tri: ( ,
-) . V d , - s c tnh
( ,
, -, hay , - s c tnh bng , , -. Chnh v vy tnh
bng , ,
- th ,
- v ,
- phi c tnh trc. Suy ra th t hp l tnh cc
phn t trong bng th ta s phi tnh ln lt cc hng t trn xung v trn mi hng th
tnh theo th t t tri qua phi.
iu c ngha l ban u ta phi tnh hng 0 ca bng. Theo nh ngha ,
c cc phn t l s nguyn dng
, v d thy rng ,

- l s dy

m tng bng , theo quy c ca u bi th


.

By gi gii thut m tr nn rt n gin:

Khi to hng 0 ca bng : ,

Dng cng thc truy hi tnh ra tt c cc phn t ca bng


- l s cch phn tch cn tm
Cui cng cho bit ,

; ,

Chng ta s ci t chng trnh m s cch phn tch s vi khun dng nhp/xut d


liu nh sau:
Input
S t nhin
Output
S cch phn tch s
Sample Input
400

Sample Output
6727090051741041926 Analyses

NUMBERPARTITIONING1_DP.PAS m s cch phn tch s

{$MODE OBJFPC}
program Counting1;
const
max = 400;
var
f: array[0..max, 0..max] of Int64;
n, m, v: Integer;
begin
Readln(n);
//Kh i t o hng 0 ca bng

FillByte(f[0, 1], n * SizeOf(Int64), 0);


f[0, 0] := 1;
//Tnh bng f

for m := 1 to n do
for v := 0 to n do
if v < m then f[m, v] := f[m - 1, v]
else f[m, v] := f[m - 1, v] + f[m, v - m];
Writeln(f[n, n], ' Analyses');
end.

3.1.3. Ci tin th nht


Cch lm trn c th tm tt li nh sau: Khi to hng 0 ca bng, sau dng hng 0 tnh
hng 1, dng hng 1 tnh hng 2, v.v ti khi tnh c ht hng . C th nhn thy rng
khi tnh xong hng th
vic tnh hng

th vic lu tr cc hng t 0 ti

ch ph thuc cc gi tr lu tr trn hng

cn lu tr hai hng ca mng : hng


hng

l khng cn thit bi v
. Do qu trnh tnh ton ch

tng ng vi hng va c tnh ca bng

tng ng vi hng sp tnh ca bng : u tin hng

c gn cc gi tr tng

ng trn hng 0 ca bng ; sau , cng thc truy hi s c p dng tnh hng
hng . Tip theo, hai hng

v
t

s i vai tr cho nhau v cng thc truy hi tip tc dng

hng

tnh hng , hng

sau khi tnh s gm cc gi tr tng ng trn hng 2 ca bng ,

v.v Vy ta c mt cch ci t ci tin sau:

NUMBERPARTITIONING2_DP.PAS m s cch phn tch s

{$MODE OBJFPC}
program Counting2;
const
max = 400;
var
f: array[0..1, 0..max] of Int64;
x, y: Integer;
n, m, v: Integer;
begin
Readln(n);
FillByte(f[0, 1], n * SizeOf(Int64), 0);
f[0, 0] := 1;
x := 0; y := 1; x h{ng ~ c, y h{ng ang tnh
for m := 1 to n do
begin //Dng hng x tnh hng y
for v := 0 to n do
if v < m then f[y, v] := f[x, v]
else f[y, v] := f[x, v] + f[y, v - m];
x := 1 - x; y := 1 - y;
o vai tr x v y, tnh xoay l i
end;
Writeln(f[x, n], ' Analyses');
end.

3.1.4. Ci tin th hai


Ta vn cn cch tt hn na, ti mi bc, ta ch cn lu li mt hng ca bng

nh mng

mt chiu, sau p dng cng thc truy hi ln mng tnh li chnh n, sau khi tnh,
mng mt chiu s cha cc gi tr trn hng k tip ca bng .

NUMBERPARTITIONING3_DP.PAS m s cch phn tch s

{$MODE OBJFPC}
program Counting3;
const
max = 400;
var
f: array[0..max] of Int64;
n, m, v: Integer;
begin
Readln(n);
FillByte(f[1], n * SizeOf(Int64), 0);
f[0] := 1;
for m := 1 to n do
for v := m to n do //Ch cn tnh l i cc f[v] vi v m
Inc(f[v], f[v - m]);
Writeln(f[n], ' Analyses');
end.

3.1.5. Ci t quy
,
Xem li cng thc truy hi tnh ,
- ta phi bit c chnh xc ,
tnh ,
th t tnh cc phn t trong bng

- v ,

-, ta nhn thy rng


-. Nh vy vic xc nh

(phn t no tnh trc, phn t no tnh sau) l quan

trng. Trong trng hp th t ny kh xc nh, ta c th tnh da trn mt hm quy


m khng cn phi quan tm ti th t tnh ton. Trc khi trnh by phng php ny, ta
s th vit mt hm quy theo cch quen thuc gii cng thc truy hi:

NUMBERPARTITIONING4_RECUR.PAS m s cch phn tch s

{$MODE OBJFPC}
program Counting4;
var
n: Integer;
function Getf(m, v: Integer): Int64;
begin
if m = 0 then //phn neo
if v = 0 then Result := 1
else Result := 0
else //phn quy
if v < m then Result := Getf(m - 1, v)
else Result := Getf(m - 1, v) + Getf(m, v - m);
end;
begin
Readln(n);
Writeln(Getf(n, n), ' Analyses');
end.

Phng php ci t ny t ra kh chm v vi mi gi tr ca

v , hm

) c th

b tnh nhiu ln (bi sau s gii thch r hn iu ny). Ta c th ci tin bng cch kt hp
(
) vi mt mng hai chiu . Ban u cc phn t ca c coi l
hm quy
(
) trc ht s tra cu ti
cha bit (bng cch gn mt gi tr c bit). Hm
,
-, nu ,
- cha bit th hm
- ri
(
) s gi quy tnh gi tr ca ,
- bit th hm ny ch vic gn kt
dng gi tr ny gn cho kt qu hm, cn nu ,
qu hm l ,

- m khng cn gi quy tnh ton na.

NUMBERPARTITIONING5_DP.PAS m s cch phn tch s

{$MODE OBJFPC}
program Counting5;
const
max = 400;
var
n: Integer;
f: array[0..max, 0..max] of Int64;
function Getf(m, v: Integer): Int64; //Tnh f[m, v]
begin
if f[m, v] = -1 then //N u f m, v ch a c tnh th i tnh f m, v

if m = 0 then //phn neo


if v = 0 then f[m, v] := 1
else f[m, v] := 0
else //phn quy
if v < m then f[m, v] := Getf(m - 1, v)
else f[m, v] := Getf(m - 1, v) + Getf(m, v - m);
Result := f[m, v]; //Gn k t qu hm b ng f[m, v]
end;
begin
Readln(n);
FillByte(f, SizeOf(f), $FF); //Cc phn t ca f c gn gi tr c bit (-1)
Writeln(Getf(n, n), ' Analyses');
end.

Vic s dng phng php quy gii cng thc truy hi l mt k thut ng lu , v
khi gp mt cng thc truy hi phc tp, kh xc nh th t tnh ton th phng php ny
t ra rt hiu qu, hn th na n lm r hn bn cht quy ca cng thc truy hi.
Ngoi ra, nu nhp vo

v in ra bng
0
1
2
3
4
5

Nhn vo bng kt qu

vi

sau khi tnh, ta s c bng sau:

0 1 2
1 0 0
1 1 1
1 1 2
1 1 2
1 1 -1
1 -1 -1

3
0
1
2
-1
-1
-1

4
0
1
-1
-1
-1
-1

5
0
1
3
5
6
7

, ta thy cn rt nhiu phn t mang gi tr

(cha

c tnh), iu ny ch ra rng ci t quy cn cho php chng ta b qua khng cn tnh


- v lm tng tc ng k qu trnh tnh
nhng phn t khng tham gia vo vic tnh ,
ton.

3.1.6. Tm tt k thut gii cng thc truy hi


Cng thc truy hi c vai tr quan trng trong bi ton m, chng hn m s cu hnh
tho mn iu kin no , hoc tm tng ng gia mt s th t v mt cu hnh.
V d trong bi ny l thuc dng m s cu hnh tho mn iu kin no . Tuy nhin nu
t li bi ton: Nu em tt c cc dy s nguyn dng khng gim c tng bng
theo th t t in th dy th

sp xp

l dy no?, hoc cho mt dy s nguyn dng khng

gim c tng bng , hi dy ng th my?. Lc ny ta s c bi ton tm tng ng


gia mt s th t v mt cu hnh - Mt dng bi ton c th gii quyt hiu qu bng cng
thc truy hi.
Ta cng kho st mt vi k thut ph bin gii cng thc truy hi: Phng php tnh
trc tip bng gi tr, phng php tnh lun phin (ch phi lu tr cc phn t tch cc),
phng php t cp nht gi tr, v phng php quy kt hp vi bng lu tr. Nhng

phng php ny s ng vai tr quan trng trong vic ci t chng trnh gii cng thc
truy hi - Ht nhn ca bi ton quy hoch ng.

3.1.7. Ni thm v bi ton phn tch s


Bi ton phn tch s (integer partitioning) l mt bi ton quan trng trong lnh vc s hc
v vt l. Chng ta khng i su vo chi tit hai lnh vc ny m ch ni ti mt kt qu
c chng minh bng l thuyt s hc v cc s ng gi|c (pentagonal numbers):
(

Nhng s ng gic l nhng s nguyn c dng ( )

nhn ln lt cc gi tr trong dy

vi

. Bng cch cho

ta c th lit k cc s ng

gic theo th t tng dn l:


Gi ( ) l s cch phn tch s thnh tng ca cc s nguyn dng (khng tnh hon v).
Quy c ( )
v ( )
vi
, khi :
( )

. (

( ))
)

))/

(
)

(3.2)

Chng ta c th s dng cng thc truy hi (3.2) m s cch phn tch s trong thi gian
( ) thay v (

) nu dng cng thc (3.1) nh cc chng trnh trc. Trong chng

trnh di y, trnh li trn s khi php cng c th cho kt qu vt qu phm vi biu


din s nguyn 64 bit, chng ta tnh ( ) theo cch:
(

( ))

))

( )

NUMBERPARTITIONING6_DP.PAS m s cch phn tch s

{$MODE OBJFPC}
program Counting6;
const
max = 400;
var
n, i, k, s: Integer;
f: array[0..max] of Int64;
SumA, SumB: Int64;
function p(k: Integer): Integer; //S ng gi|c p k
begin
Result := k * (3 * k - 1) shr 1;
end;

(3.3)

begin
Readln(n);
f[0] := 1;
for i := 1 to n do
begin
SumA := 0;
SumB := 0;
s := 1;
k := 1;
while p(k) <= i do
begin
Inc(SumA, s * f[i - p(k)]);
if p(-k) <= i then
Inc(SumB, s * f[i - p(-k)]);
Inc(k);
s := -s;
o du h ng t
end;
f[i] := SumA + SumB;
end;
Writeln(f[n], ' Analyses');
end.

3.2. Phng php quy hoch ng


3.2.1. Bi ton quy hoch ng
Trong ton hc v khoa hc my tnh, quy ho ch ng (dynamic programming) l mt
phng php hiu qu gii nhng bi ton ti u c ba tnh cht sau y:

Bi ton ln c th phn r thnh nhng bi ton con ng dng, nhng bi ton con
c th phn r thnh nhng bi ton nh hn na (recursive form).

Li gii ti u ca cc bi ton con c th s dng tm ra li gii ti u ca bi ton


ln (optimal substructure)

Hai bi ton con trong qu trnh phn r c th c chung mt s bi ton con khc
(overlapping subproblems).

Tnh cht th nht v th hai l iu kin cn ca mt bi ton quy hoch ng. Tnh cht
th ba nu ln c im ca mt bi ton m cch gii bng phng php quy hoch ng
hiu qu hn hn so vi phng php gii quy thng thng.
Vi nhng bi ton c hai tnh cht u tin, chng ta thng ngh n cc thut ton chia
tr v quy: gii quyt mt bi ton ln, ta chia n ra thnh nhiu bi ton con ng
dng v gii quyt c lp cc bi ton con .
Khc vi thut ton quy, phng php quy hoch ng thm vo c ch lu tr nghim
hay mt phn nghim ca mi bi ton khi gii xong nhm mc ch s dng l i, hn ch
nhng thao tc tha trong qu trnh tnh ton.
Chng ta xt mt v d n gin: Dy Fibonacci l dy v hn cc s nguyn dng
c nh ngha bng cng thc truy hi sau:

Hy tnh

t on chng trnh sau:


program TopDown;
function f(i: Integer): Integer;
begin
if i 2 then Result := 1
else Result := f(i - 1) + f(i - 2);
end;
begin
Output f(6);
end.

Trong cch gii ny, hm quy ( ) c dng tnh s Fibonacci th . Chng trnh
chnh gi ( ), n s gi tip ( ) v ( ) tnh Qu trnh tnh ton c th v nh cy
trong Hnh 3-1.
( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

Hnh 3-1. Hm quy tnh s Fibonacci

Ta thy rng tnh ( ), my phi tnh mt ln ( ), hai ln ( ), ba ln ( ), nm ln


( ) v ba ln ( ). S thiu hiu qu c th gii thch bi tnh cht: Hai bi ton trong qu
trnh phn r c th c chung mt s bi ton con. V d nu coi li gi hm ( ) tng ng
vi bi ton tnh s Fibonacci th , th bi ton ( ) l bi ton con chung ca c ( ) v
( ). iu ch ra rng nu tnh ( ) v ( ) mt cch c lp, bi ton ( ) s phi gii
hai ln.

( )

( )

( )

( )

( )

( )

Hnh 3-2. Tnh cht tp cc bi ton con gi nhau (overlapping subproblems) khi tnh s Fibonacci.

khc phc nhng nhc im trong vic gii c lp cc bi ton con, mi khi gii xong
mt bi ton trong qu trnh phn r, chng ta s l u tr li gii ca n nhm mc ch s
dng l i. Chng hn vi bi ton tnh s Fibonacci th 6, ta c th dng mt mng
lu tr cc gi tr s Fibonacci, khi to sn gi tr cho
lt

bng 1, t tnh tip ln

, m bo mi gi tr Fibonacci ch phi tnh mt ln:

program BottomUp;
var
f: array[1..6] of Integer;
i: Integer;
begin
f[1] := 1; f[2] := 1;
for i := 3 to 6 do
f[i] := f[i - 1] + f[i - 2];
Output f[6];
end.

K thut lu tr li gii ca cc bi ton con nhm mc ch s dng li c gi l


memoization*, nu ti mt bc no m li gii mt bi ton con khng cn cn thit
na, chng ta c th b li gii i khi khng gian lu tr tit kim b nh. V d khi
ta ang cn tnh

th ch cn bit gi tr

l nn vic lu tr cc gi tr

l v

ngha. Nhng k thut ny chng ta bn n trong mc 3.1.3 v 3.1.4. C th bi ton tnh


s Fibonacci, ta c th ci t dng hai bin lun phin:

* T ny khng c trong t in ting Anh, c th coi nh t ng ngha vi memorization, gc t: memo (Bn


ghi nh)

program BottomUp;
var
a, b: Integer;
i: Integer;
begin
a := 1; b := 1;
for i := 3 to 6 do
begin
b := a + b; //b := f[i]
a := b a; //a := f[i 1]
end;
Output b;
end.

Cch gii ny bt u t vic gii bi ton nh nht, lu tr nghim v t gii quyt


nhng bi ton ln hncch tip cn ny gi l cch tip cn t di ln (bottom-up).
Cch tip cn t di ln khng cn c chng trnh con quy, v vy bt i mt s ng
k li gi chng trnh con v tit kim c b nh cha tham s v bin a phng ca
chng trnh con quy. Tuy nhin vi cch tip cn t di ln, chng ta phi xc nh r
th t gii cc bi ton khi bt u gii mt bi ton no th tt c cc bi ton con ca
n phi c gii sn t trc, iu ny i khi tng i phc tp (xc nh th t t-p
trn tp cc bi ton phn r). Trong trng hp kh (hoc khng th) xc nh th t hp
l gii quyt cc bi ton con, ngi ta s dng cch tip cn t trn xung (top-down) kt
hp vi k thut lu tr nghim (memoization), k thut ny chng ta cng bn n
trong mc 3.1.5. Vi bi ton tnh s Fibonacci, ta c th ci t bng hm quy nh sau:
program TopDownWithMemoization;
var
f: array[1..6] of Integer;
i: Integer;
function Getf(i: Integer): Integer;
begin
if f[i] = 0 then f i ch a c tnh th mi i tnh f i
if i 2 then f[i] := 1
else f[i] := Getf(i 1) + Getf(i 2);
Result := f[i]; //Gn k t qu hm b ng f[i]
end;
begin
for i := 1 to 6 do f[i] := 0;
Output Getf(6);
end.

Trc khi i vo phn tch cch tip cn mt bi ton quy hoch ng, ta lm quen vi mt
s thut ng sau y:

Bi ton gii theo phng php quy hoch ng gi l bi ton quy ho ch ng.

Cng thc phi hp nghim ca cc bi ton con c nghim ca bi ton ln gi l


cng thc truy hi ca quy hoch ng.

Tp cc bi ton nh nht c ngay li gii t gii quyt cc bi ton ln hn gi l


c s quy ho ch ng.

Khng gian lu tr li gii cc bi ton con tm cch phi hp chng gi l bng


ph ng |n ca quy ho ch ng.

3.2.2. Cch gii mt bi ton quy hoch ng


Vic gii mt bi ton quy hoch ng phi qua kh nhiu bc, t nhng phn tch trn,
ta c th hnh dung:
Quy hoch ng = Chia tr + C ch lu tr nghim s dng li
(Dynamic Programming = Divide and Conquer + Memoization)
Khng c mt thut ton no cho chng ta bit mt bi ton c th gii bng phng php
quy hoch ng hay khng? Khi gp mt bi ton c th, chng ta phi phn tch bi ton,
sau kim chng ba tnh cht ca mt bi ton quy hoch ng trc khi tm li gii bng
phng php quy hoch ng.
Nu nh bi ton t ra ng l mt bi ton quy hoch ng th vic u tin phi lm l
phn tch xem mt bi ton ln c th phn r thnh nhng bi ton con ng dng nh th
no, sau xy dng cch tm nghim ca bi ton ln trong iu kin chng ta bit
nghim ca nhng bi ton con - tm cng thc truy hi. y l cng on kh nht v chng
c phng php tng qut no xy dng cng thc truy hi c, tt c u da vo kinh
nghim v nhy cm ca ngi lp trnh khi c v phn tch bi ton.
Sau khi xy dng cng thc truy hi, ta phi phn tch xem ti mi bc tnh nghim ca
mt bi ton, chng ta cn l u tr bao nhiu bi ton con v vi mi bi ton con th cn l u
tr ton b nghim hay mt phn nghim. T xc nh lng b nh cn thit lu tr,
nu lng b nh cn huy ng vt qu dung lng cho php, chng ta cn tm mt cng
thc khc hoc thm ch, mt cch gii khc khng phi bng quy hoch ng.
Mt iu khng km phn quan trng l phi ch ra c bi ton no cn phi gii tr c
bi ton no, hoc ch t l ch ra c khi nim bi ton ny nh hn bi ton kia ngha l
th no. Nu khng, ta c th ri vo qu trnh lng vng: Gii bi ton
ton

, gii bi ton

li cn phi gii bi ton

cn phi gii bi

(cng thc truy hi trong trng hp

ny l khng th gii c). Cng nh ch r quan h nh hn gia cc bi ton m ta c


th xc nh c mt tp cc bi ton nh nht c th gii trc tip, nghim ca chng sau
c dng lm c s gii nhng bi ton ln hn.
Trong a s cc bi ton quy hoch ng, nu bn tm c ng cng thc truy hi v xc
nh ng tp cc bi ton c s th coi nh phn ln cng vic xong. Vic tip theo l ci
t chng trnh gii cng thc truy hi:

Nu gii cng thc truy hi theo cch tip cn t di ln, trc ht cn gii tt c cc
bi ton c s, lu tr nghim vo bng phng n, sau dng cng thc truy hi
tnh nghim ca nhng bi ton ln hn v lu tr vo bng phng n cho ti khi bi
ton ban u c gii. Cch ny yu cu phi xc nh c chnh xc th t gii cc
bi ton (t nh n ln). u im ca n l cho php d dng loi b nghim nhng
bi ton con khng dng n na tit kim b nh lu tr cho bng phng n.

Nu gii cng thc truy hi theo cch tip cn t trn xung, bn cn phi c c ch
nh du bi ton no c gii, bi ton no cha. Nu bi ton cha c gii, n
s c phn r thnh cc bi ton con v gii bng quy. Cch ny khng yu cu
phi xc nh th t gii cc bi ton nhng cng chnh v vy, kh khn s gp phi
nu mun loi b bt nghim ca nhng bi ton con khng dng n na tit kim
b nh lu tr cho bng phng n.

Cng on cui cng l ch ra nghim ca bi ton ban u. Nu bng phng n lu tr


ton b nghim ca cc bi ton th ch vic a ra nghim ca bi ton ban u, nu bng
phng n ch lu tr mt phn nghim, th trong qu trnh tnh cng thc truy hi, ta li
mt manh mi no (gi l vt) khi kt thc qu trnh gii, ta c th truy vt tm ra
ton b nghim.
Chng ta s kho st mt s bi ton quy hoch ng kinh in hnh dung c nhng k
thut c bn trong vic phn tch bi ton quy hoch ng, tm cng thc truy hi cng nh
lp trnh gii cc bi ton quy hoch ng.

3.3. Mt s bi ton quy hoch ng


3.3.1. Dy con n iu tng di nht
Cho dy s nguyn

). Mt dy con ca

s phn t gi nguyn th t. Nh vy
Yu cu: Tm dy con n iu tng ca
dy ch s

l mt cch chn ra trong

dy con.

c di ln nht. Tc l tm mt s

sao cho

Input

Dng 1 cha s

Dng 2 cha

s nguyn

| |

Output
Dy con n iu tng di nht ca dy

mt

ln nht v

Sample Input
12
1 2 3 8 9 4 5 6 2 3 9 10

Sample Output
Length = 8
a[1] = 1
a[2] = 2
a[3] = 3
a[6] = 4
a[7] = 5
a[8] = 6
a[11] = 9
a[12] = 10

Thut ton
B sung vo

hai phn t:

. Khi dy con n iu tng di nht

ca dy chc chn s bt u t v kt thc


. Vi mi gi tr (
, - l di dy con n iu tng di nht bt u ti .

), gi

Ta s xy dng cch tnh cc gi tr , - bng cng thc truy hi. Theo nh ngha, , - l
di dy con n iu tng di nht bt u ti

, dy con ny c thnh lp bng cch ly

ghp vo u mt trong s nhng dy con n iu tng di nht bt u ti v tr


ng sau

. Ta s chn dy no ghp thm

vo u nhng dy con bt u ti

( m bo tnh tng) v d nhin

vo u ( m bo tnh di nht). Vy , - c tnh


n
m
, chn ra ch s
c ,

nh sau: t tt c cc ch s t
,

vo u?, tt nhin ta ch c ghp

no ln hn

ta s chn dy di nht ghp


ln nht v t , -

no

K thut lu vt s c thc hin song song vi qu trnh tnh ton. Mi khi tnh
,,
, ta t , ghi nhn rng dy con di nht bt u ti s
c phn t k tip l
,,-

:
{ ,-

va

{ ,-

va

(3.4)

T cng thc truy hi tnh cc gi tr , -, ta nhn thy rng tnh , - th cc gi tr , vi

phi c tnh trc. Tc l th t tnh ton ng phi l tnh t cui mng

u mng . Vi th t tnh ton nh vy, c s quy hoch ng (bi ton nh nht) s l


-, theo nh ngha th dy con n iu tng di nht bt u ti
php tnh ,
ch c mt phn t l chnh n nn ,

10

11

10

11

10

11

Hnh 3-3. Giai cong thc truy hoi va truy vet

Sau khi tnh xong cc gi tr , - v , - vic ch ra dy con n iu tng di nht c thc


hin bng cch truy vt theo chiu ngc li, t u mng v cui mng , c th l ta bt
u t phn t , -:
, - chnh l ch s phn t u tin c chn (
, - l ch s phn t th hai c chn (

).

, - l ch s phn t th ba c chn (

).

).

Ci t
Di ay ta se cai at chng tr nh giai bai toan t m day con n ieu tang dai nhat theo
nhng phan t ch tren.

LIS.PAS T m day con n ieu tang dai nhat

{$MODE OBJFPC}
program LongestIncreasingSubsequence;
const
max = 1000000;
maxV = 1000000;
var
a, f, t: array[0..max + 1] of Integer;
n: Integer;
procedure Enter; Nhp d liu
var
i: Integer;
begin
ReadLn(n);
for i := 1 to n do Read(a[i]);
end;
procedure Optimize; Quy ho ch ng
var
i, j, jmax: Integer;

begin
a[0] := -maxV - 1; a[n + 1] := maxV + 1;
f[n + 1] := 1;
t c s quy ho ch ng
for i := n downto 0 do
ii c ng thc truy hi
begin Tnh f i
Tm jmax > j tho m~n a jmax > a j v{ f jmax ln nht

jmax := n + 1;
for j := i + 1 to n do
if (a[j] > a[i]) and (f[j] > f[jmax]) then jmax := j;
f[i] := f[jmax] + 1; L u tr nghim - memoization
t[i] := jmax; L u v t
end;
end;
procedure PrintResult; In k t qu
var
i: Integer;
begin
WriteLn('Length = ', f[0] - 2);
~y k t qu phi b i hai phn t a 0 v{ a n
i := t[0]; Truy v t bt u t t[0]
while i <> n + 1 do
begin
WriteLn('a[', i, '] = ', a[i]);
i := t[i]; Xt phn t k ti p
end;
end;
begin
Enter;
Optimize;
PrintResult;
end.

Ci tin
Nhc li cng thc truy hi tnh cc , - l:
,-

{ ,- (

) va (

)}

(3.5)

e giai cong thc truy hoi bng cch ci t tren, ta se can thi gian (
Vi kch thc d liu ln (

) tnh mng .

) th chng trnh ny chy rt chm. Ta cn mt gii

php tt hn cho bi ton ny.


Quan st sau y s cho ta mt thut ton vi phc tp tnh ton l (
di dy

l di dy con n iu tng di nht tm c.

t on cui dy

) vi

bt u t ch s

l di dy con tng di nht trong on ny.


), gi l ch s ca phn t
Vi mi di (
iu tng di

bt u t

kin ny th ta chn

). Gi:
tho mn: Tn ti dy n

. Nu c nhiu phn t trong dy

cng tho mn iu

l phn t ln nht trong s nhng phn t .

Vi mi ch s (

), gi

n iu tng di nht bt u ti
Chng ta s tnh

l ch s phn t lin sau phn t


.

, cc gi tr , - v cc gi tr

Trng hp c s: R rng khi


phn t l

bng phng php quy hoch ng theo .

, on cui dy

nn trong trng hp ny,

Nhn xt rng nu bit c cc gi tr


cc gi tr

()

trong dy con

()

bt u t ch s

()

ch c mt

tng ng vi mt ch s no th

c tnh cht:
(3.6)

Tht vy, v dy con tng di nht bt u ti

c di , dy con ny nu xt t phn t

th hai tr i s to thnh mt dy con tng di


hn

(theo cch xy dng

tnh cc gi tr

()

()

). Vy ta c
tng ng vi ch s

tr

Dng thut ton tm kim nh phn trn dy

()

()

tng ng vi ch s

nht tha mn
ti

. Phn t th hai ny chc chn nh


( ).
, trong trng hp bit cc gi

, ta c th lm nh sau:
tm gi tr

. n y ta xc nh c di dy con tng di nht bt u

, lu li vt

. C th hiu thao tc ny l em

con tng di c mt dy con tng di

Cp nht li

ln

mi

cu

) v

ni vo u mt dy

Bn cht ca thut ton l ti mi bc ta lu thng tin v cc dy con tng di

Nu c nhiu dy con tng cng mt di, ta ch quan tm ti dy c phn t bt u ln


nht ( d ni thm mt phn t khc vo u dy). Hin ti
ca mt dy con tng di

. Sau khi ni

vo u mt dy con tng di

cng l phn t bt u ca mt dy con tng di


ca thut ton tm kim nh phn trn, ta c
thm phn t khc vo u hn nn ta cp nht li

ang l phn t bt u
th

. Xt v mt gi tr, do tnh cht


, tc l dy bt u ti
. (Hnh 3-4)

d ni

Ln

di 1

di

di

Cp nht

di

di

Nh

Hnh 3-4

LIS2.PAS T m day con n ieu tang dai nhat (ci tin)

{$MODE OBJFPC}
program LongestIncreasingSubsequence;
const
max = 1000000;
maxV = 1000000;
var
a, t: array[0..max + 1] of Integer;
s: array[1..max + 2] of Integer;
n, m: Integer;
procedure Enter;
p
u
var
i: Integer;
begin
ReadLn(n);
for i := 1 to n do Read(a[i]);
end;
procedure
begin
a[0] :=
m := 1;
s[1] :=
end;

Init; //Khi to
-maxV - 1; a[n + 1] := maxV + 1;//Thm vo 2 phn t
y con tng n t bt u t a[n + 1]

n + 1; Tn s[] v = 1

//Thu t ton tm kim nh phn nh n vo mt phn t a[i] = v,


v tm trong y a[s[1]] > a[s[2]] > > a[s[m]], tr v ch s n nht tho mn a[s[]] > v

function BinarySearch(v: Integer): Integer;


var
Low, Middle, High: Integer;

begin
Low := 2; High := m;
while Low <= High do
begin
Middle := (Low + High) div 2;
if a[s[Middle]] > v then Low := Middle + 1
else High := Middle - 1;
end;
Result := High;
end;
procedure Optimize; uy oc ng
var
i, lambda: Integer;
begin
for i := n downto 0 do
c ng t c truy
begin
lambda := BinarySearch(a[i]);
t[i] := s[lambda];
u vt
if lambda + 1 > m then //C p nh t m l y con tng n t cho ti th m ny
m := lambda + 1;
s[lambda + 1] := i;
end;
end;
procedure PrintResult; n t qu
var
i: Integer;
begin
WriteLn('Length = ', m - 2); y t qu p
i := t[0]; Truy vt t u t t[ ]
while i <> n + 1 do
begin
WriteLn('a[', i, '] = ', a[i]);
i := t[i];
t p n t t p
end;
end;

a p n t a[ ] v a[n 1]

begin
Enter;
Init;
Optimize;
PrintResult;
end.

3.3.2. Bi ton xp ba l
Cho

sn phm, sn phm th c trng lng l

bal c gii hn trng lng l

v gi tr l

). Cho mt

, hy chn ra mt s sn phm cho vo bal sao cho tng

trng lng ca chng khng vt qu

v tng gi tr ca chng l ln nht c th.

Input

Dng 1 cha hai s nguyn dng

dng tip theo, dng th cha hai s nguyn dng


cch (

)
,

cch nhau t nht mt du

Output
Phng n chn cc sn phm c tng trng lng
Sample Input
5 11
3 30
4 40
5 40
9 100
4 40

v tng gi tr ln nht c th.

Sample Output
Selected objects:
1. Object 5: Weight = 4; value = 40
2. Object 2: Weight = 4; value = 40
3. Object 1: Weight = 3; value = 30
Total weight: 11
Total value : 110

Thut ton
Bi ton Knapsack tuy cha c thut ton gii hiu qu trong trng hp tng qut nhng
vi rng buc d liu c th nh bi ny th c thut ton quy hoch ng kh hiu qu
gii, di y chng ta s trnh by cch lm .
Gi ,

- l gi tr ln nht c th c bng cch chn trong cc sn phm *

hn trng lng . Mc ch ca chng ta l i tm ,


cch chn trong

+ vi gii

-: Gi tr ln nht c th c bng

sn phm cho vi gii hn trng lng

Vi gii hn trng lng , vic chn trong s cc sn phm *

+ c gi tr ln nht

s l mt trong hai kh nng:

Nu khng chn sn phm th , th , - l gi tr ln nht c th c bng cch chn


+ vi gii hn trng lng bng . Tc l
trong s cc sn phm *
,

Nu c chn sn phm th (tt nhin ch xt ti trng hp ny khi m


), th
, - bng gi tr sn phm th (
) cng vi gi tr ln nht c th c c bng
+ vi gii hn trng lng
cch chn trong s cc sn phm *
(

-). Tc l v mt gi tr thu c, ,

Theo cch xy dng ,


,

-, ta suy ra cng thc truy hi:

- e
* ,

- ,

T cng thc truy hi, ta thy rng tnh cc phn t trn hng ca bng

(3.7)
th ta cn phi

bit cc phn t trn hng lin trc (hng

). Vy nu ta bit c hng 0 ca bng


th c th tnh ra mi phn t trong bng. T suy ra c s quy hoch ng: , - theo

nh ngha l gi tr ln nht c th bng cch chn trong s 0 sn phm, nn hin nhin


, .
Tnh xong bng phng n th ta quan tm n ,
khi chn trong c

-, chnh l gi tr ln nht thu c

sn phm vi gii hn trng lng

. Vic cn li l ch ra phng n

chn cc sn phm.

Nu ,
tip ,

,
-.

- th tc l phng n ti u khng chn sn phm , ta truy

Cn nu ,

v truy tip ,

- th ta thng bo rng php chn ti u c chn sn phm


-.

C tip tc cho ti khi truy ln ti hng 0 ca bng phng n.


Ci t
R rng ta c th gii cng thc truy hi theo kiu t di ln: Khi to hng 0 ca bng
phng n

ton s 0, sau dng cng thc truy hi tnh ln lt t hng 1 ti hng .

Tuy nhin trong chng trnh ny chng ta s gii cng thc truy hi theo kiu t trn
xung (s dng hm quy kt hp vi k thut lu tr nghim) v cch gii ny khng
phi i tnh ton b bng phng n.

KNAPSACK_DP.PAS Bi ton xp ba l

{$MODE OBJFPC}
program Knapsack;
const
maxN = 1000;
maxM = 10000;
var
w, v: array[1..maxN] of Integer;
f: array[0..maxN, 0..maxM] of Integer;
n, m: Integer;
SumW, SumV: Integer;
procedure Enter; //Nhp d liu
var
i: Integer;
begin
ReadLn(n, m);
for i := 1 to n do ReadLn(w[i], v[i]);
end;
function Getf(i, j: Integer): Integer; //Tnh f[i, j]
begin
if f[i, j] = -1 then //N u f i, j ch a c tnh th mi i tnh
if i = 0 then f[i, j] := 0 C s quy ho ch ng
else
if (j < w[i]) or
(Getf(i - 1, j ) > Getf(i - 1, j - w[i]) + v[i]) then
f[i, j] := Getf(i - 1, j) //Khng chn sn phm i th tt hn
else
f[i, j] := Getf(i - 1, j - w[i]) + v[i]; //Chn sn phm i th tt hn
Result := f[i, j]; //Tr v f[i, j] trong k t qu hm
end;
procedure PrintResult; //In k t qu
var
Count: Integer;
begin
WriteLn('Selected objects:');
Count := 0;
SumW := 0;

while n <> 0 do //Truy v t t f[n, m]


begin
if Getf(n, m) <> Getf(n - 1, m) then Ph ng |n ti u c chn sn phm n
begin
Inc(Count);
Write(Count, '. Object ', n, ': ');
WriteLn('Weight = ', w[n], '; value = ', v[n]);
Inc(SumW, w[n]);
Dec(m, w[n]); //Chn sn phm n ri th gii h n trng l ng gim i w n
end;
Dec(n);
end;
WriteLn('Total weight: ', SumW);
WriteLn('Total value : ', SumV);
end;
begin
Enter;
FillByte(f, SizeOf(f), $FF); //Kh i t o cc phn t ca f l - ch a c tnh)
SumV := Getf(n, m);
PrintResult;
end.

Nu thm vo mt on chng trnh in ra bng


d liu nh trong v d, bng
0
1
2
3
4
5

0
0
-1
-1
-1
-1
-1

sau khi gii cng thc truy hi th vi

s l:

1 2 3 4 5 6
7 8 9 10 11
-1 0
0 0 -1
0
0 0 -1 -1
0
-1 0 30 -1 -1 30 30 -1 -1 -1
30
-1 0 -1 -1 -1 40 70 -1 -1 -1
70
-1 0 -1 -1 -1 -1 70 -1 -1 -1
80
-1 -1 -1 -1 -1 -1 70 -1 -1 -1 100
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 110

Ta thy cn rt nhiu gi tr

trong bng, ngha l c rt nhiu phn t trong bng


-. iu ch ra rng cch gii cng thc truy hi
khng tham gia vo qu trnh tnh ,
t trn xung trong trng hp ny s hiu qu hn cch gii t di ln v n khng cn
tnh ton b bng phng n ca quy hoch ng.

3.3.3. Bin i xu
Vi xu k t

, xt 3 php bin i:

( ): Xo k t ti v tr ca xu .
( ): Thay k t ti v tr ca xu

): Chn k t vo sau v tr ca xu .

Yu cu: Cho hai xu k t

bi k t .
(

ci in hoa, hy tm mt s t nht cc php bin i k trn bin xu


Input

Dng 1 cha xu

) ch gm cc ch
thnh xu .

Dng 2 cha xu

Output
Cch bin i

thnh
Sample Input
ACGGTAG
CCTAAG

Sample Output
Number of alignments: 4
X = ACGGTAG
Insert(5, A)
X = ACGGTAAG
Delete(4)
X = ACGTAAG
Delete(3)
X = ACTAAG
Replace(1, C)
X = CCTAAG

Bi ton ny (String alignment*) c ng dng kh nhiu trong Tin-sinh hc phn tch v


so snh cc yu t di truyn (DNA, RNA, proteins, chromosomes, genes, ). D liu di truyn
thng c dng chui, chng hn mt phn t DNA c th biu din di dng chui cc k
+ hay mt phn t RNA c th biu din bng chui cc k t *
+. tr
t *
li cu hi hai mu d liu di truyn (m ho di dng xu k t) ging nhau n mc no,
ngi ta c th dng s lng cc php bin i k trn o mc khc bit gia hai
mu. Tu vo tng yu cu thc t, ngi ta cn c th thm vo nhiu php bin i na,
hoc gn trng s cho tng v tr bin i (v cc v tr trong xu c th c tm quan trng
khc nhau).
C th k ra vi ng dng c th ca bi ton ging hng. Mt ng dng l xc nh chng
loi ca mt virus cha bit. Chng hn khi pht hin mt virus mi gy bnh m con ngi
cha kp hnh thnh kh nng min dch, ngi ta s i snh mu RNA ca virus vi tt
c cc mu RNA ca cc virus c trong c s d liu, t tm ra cc loi virus tng t,
xc nh chng loi ca virus v iu ch vaccine phng bnh. Mt ng dng khc l phn
tch cc chui DNA xc nh mi lin quan gia cc loi, t xy dng cy tin ho t
mt loi t tin no . Ngoi ng dng trong sinh hc phn t, bi ton ging hng cn c
nhiu ng dng khc trong khoa hc my tnh, l thuyt m, nhn dng ting ni, v.v
Thut ton
Ta tr li bi ton vi hai xu k t

. bin i xu

thnh xu , chng ta s phn tch mt bi ton con: Tm mt s t nht cc php bin i


bin k t u tin ca xu thnh k t u tin ca xu . C th, ta gi , - l s
php bin i ti thiu bin xu

Tm dch: Ging hng

thnh xu

. Khi :

Nu

th vn tr thnh bin xu

thnh xu

xt v s lng cc php bin i, trong trng hp ny ,

Nu

Hoc chn k t

vo cui xu

-.

ri bin xu

Hoc xa k t cui ca xu

Hoc thay k t cui ca xu

thnh xu

V chng ta cn ,

bi k t

ri bin xu
-

thnh

nn suy ra cng thc truy hi:


,

. Tc l nu theo s la chn ny, ,

xu

thnh xu
-

ri bin xu

Tc l nu theo s la chn ny, ,

. Ta c ba la chn:
. Tc l nu theo s la chn ny, ,

. Tc l nu

-
,
{ ,
,

(3.8)

T cng thc truy hi, ta thy rng nu biu din di dng ma trn th phn t ( )
( , -) c tnh da vo phn t nm bn tri: (
), nm pha trn: (
) v
nm gc tri trn (

). T suy ra tp cc bi ton c s:

- l s php bin i bin xu rng thnh k t u ca xu , n cn ti thiu


php chn: , ,

- l s php bin i bin xu gm


thiu php xo: , -

Vy u tin bng phng n ,

k t u ca

thnh xu rng, n cn ti

- c khi to hng 0 v ct 0 l c s quy

hoch ng. T dng cng thc truy hi tnh ra tt c cc phn t bng , sau khi tnh
xong th ,

- cho ta bit s php bin i ti thiu bin xu

thnh

.
Vic cui cng l ch ra c th cch bin i ti u, ta bt u truy vt t ,
- c tm nh th no.
vt chnh l d ngc li xem ,

Nu

th ta tm cch bin

Nu

thnh

-, vic truy

, tc l truy tip

th xt ba trng hp
,
Nu ,
th ta thc hin php
cui xu
-)

ri tm cch bin i

Nu ,

xu

ri tm cch bin i

thnh

th ta thc hin php


thnh

) chn

vo

(truy tip ,
( ) xa k t cui
-)
(truy tip ,

Nu ,

t cui xu
,

,
bi
-)

ri tm cch bin i

Ta a v vic truy vt vi
hoc
V d vi

th ta thc hin php


thnh

) thay k
(truy tip

nh hn v c lp li cho ti khi quy v bi ton c s:

.
v

, vic truy vt trn bng phng n

trong Hnh 3-5.

A
C
G
G
T
A
G

f
0
1
2
3
4
5
6
7

0
0
1
2
3
4
5
6
7

C
1
1
1
1
2
3
4
5
6

C
2
2
2
1
2
3
4
5
6

T
3
3
3
2
2
3
3
4
5

A
4
4
3
3
3
3
4
3
4

A
5
5
4
4
4
4
4
4
4

G
6
6
5
5
4
4
5
5
4

Hnh 3-5. Truy vt tm cch bin i xu

Ci t

STRINGALIGNMENT_DP.PAS Bin i xu

{$MODE OBJFPC}
program StringAlignment;
const
max = 1000;
type
TStrOperator = (soDoNothing, soInsert, soDelete, soReplace);
var
x, y: AnsiString;
f: array[0..max, 0..max] of Integer;
m, n: Integer;
procedure Enter; //Nhp d liu
begin
ReadLn(x);
ReadLn(y);
m := Length(x); n := Length(y);
end;
function Min3(x, y, z: Integer): Integer; //Tnh min ca 3 s
begin
if x < y then Result := x else Result := y;
if z < Result then Result := z;
end;
procedure Optimize; //Gii cng thc truy hi
var
i, j: Integer;
begin

c ch ra

L u c s quy ho ch ng

for j := 0 to n do f[0, j] := j;
for i := 1 to m do f[i, 0] := i;
//Dng cng thc truy hi tnh ton b bng ph ng |n

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;
//Thc hin thao tc op vi tham s v tr p v k t c trn xu X

procedure Perform(op: TStrOperator; p: Integer = 0; c: Char = #0);


begin
case op of
soInsert: //Php chn
begin
WriteLn('Insert(', p, ', ', c, ')');
Insert(c, x, p + 1);
end;
soDelete: //Php xo
begin
WriteLn('Delete(', p, ')');
Delete(x, p, 1);
end;
soReplace: //Php thay
begin
WriteLn('Replace(', p, ', ', c, ')');
x[p] := c;
end;
end;
WriteLn('X = ', x); //In ra xu X sau khi bi n i
end;
procedure PrintResult; //In k t qu
begin
WriteLn('Number of alignments: ', f[m, n]);
Perform(soDoNothing); In ra x}u X ban u
while (m <> 0) and (n <> 0) do //Lm ti khi m = n = 0
if x[m] = y[n] then //Hai k t cui ging nhau, khng lm g c, truy ti p f[m 1, n 1]
begin
Dec(m); Dec(n);
end
else //T i v tr m ca xu X cn c mt php bi n i
if f[m, n] = f[m, n - 1] + 1 then //N u l php chn
begin
Perform(soInsert, m, y[n]);
Dec(n); //Truy sang phi: f[m, n 1]
end
else
if f[m, n] = f[m - 1, n] + 1 then //N u l php xo
begin
Perform(soDelete, m);
Dec(m); //Truy ln trn: f[m 1, n]
end
else //Khng phi chn, khng phi xo th phi l php thay th

begin
Perform(soReplace, m, y[n]);
Dec(m); Dec(n); //Truy cho ln trn: f[m 1, n 1]
end;
while m > 0 do
begin
Perform(soDelete, m);
Dec(m);
end;
while n > 0 do
begin
Perform(soInsert, 0, y[n]);
Dec(n);
end;
end;
begin
Enter;
Optimize;
PrintResult;
end.

3.3.4. Phn hoch tam gic


Trn mt phng vi h ta trc chun
nh

l (

thnh

). Mt b
tam gic, ta gi b

, cho mt a gic li

, trong to

ng cho i mt khng ct nhau s chia a gic cho


ng cho l mt php tam gic phn ca a gic

li ban u.
Bi ton t ra l hy tm mt php tam gic phn c trng s (tng di cc ng cho)
nh nht.
Input

Dng 1 cha s

l s nh ca a gic (

dng tip theo, dng th cha to ca nh

Output
Php tam gic phn nh nht.

)
: gm hai s thc

Sample Input
6
4.0 0.0
5.0 1.0
6.0 5.0
2.0 5.0
0.0 3.0
2.0 1.0

Sample Output
Minimum triangulation: 12.00
P[2] - P[6] = 3.00
P[2] - P[4] = 5.00
P[4] - P[6] = 4.00

6
5
4
3
2
1
O

Thut ton
K hiu (

) l khong cch gia hai im


(

Gi ,

(3.9)

- l trng s php tam gic phn nh nht chia a gic

, khi ,

chnh l trng s php tam gic phn nh nht chia a gic ban u.
Bng quan st hnh hc ca mt php tam gic phn trn a gic

, ta nhn thy

rng trong bt k php tam gic phn no, lun tn ti mt v ch mt tam gic cha cnh
. Tam gic cha cnh
(

s c mt nh l

, mt nh l

v mt nh

). Xt mt php tam gic phn nh nht chia a gic

tam gic cha cnh

no

, ta quan tm ti

, c ba kh nng xy ra (Hnh 3-6):

Hnh 3-6. Ba trng hp ca tam gic cha cnh

Kh nng th nht, nh

, khi ng cho

s thuc php tam gic phn

ang xt, nhng ng cho cn li s phi to thnh mt php tam gic phn nh nht
chia a gic li

. Tc l trong trng hp ny:


,

),

(3.10)

Kh nng th hai, nh

, khi ng cho

s thuc php tam gic phn

ang xt, nhng ng cho cn li s phi to thnh mt php tam gic phn nh nht
chia a gic li

. Tc l trong trng hp ny:


,

Kh nng th ba, nh
cho

),

khng trng

(3.11)

v cng khng trng

, khi c hai ng

u thuc php tam gic phn, nhng ng cho cn li s to thnh hai

php tam gic phn nh nht tng ng vi a gic

v a gic

. Tc

l trong trng hp ny:


,
V ,

( ),

(3.12)

- l trng s ca php tam gic phn nh nht trn a gic

nn n s phi

l trng s nh nht ca php tam gic phn trn tt c cc kh nng chn nh


,

,
,
)

( ),

-}

tc l:
(3.13)

Trong
( ),

(
{ (
(

)
)
)

(3.14)
,

Ta xy dng xong cng thc truy hi tnh , -. T cng thc truy hi, ta nhn thy rng
, - c tnh qua cc gi tr , - v , - vi
, iu ch ra rng hiu s
chnh l th t ln-nh ca cc bi ton: Cc gi tr , - vi
ln s c tnh sau cc
gi tr ,

- c hiu s

hoch ng: Cc gi tr ,

nh hn. Th t ln-nh ny cho php tm ra c s quy


- l trng s ca php tam gic phn nh nht chia a

gic li gm 3 nh (tc l tam gic), trong trng hp ny chng ta khng cn chia g c v


trng s php tam gic phn l ,
.
Vic gii cng thc truy hi s c thc hin theo trnh t: u tin bng phng n
- c t bng 0,
c in c s quy hoch ng: Cc phn t trn ng cho ,
-, ri tnh tip
dng cng thc truy hi tnh tip cc phn t trn ng cho ,
ng cho ,

- C nh vy cho ti khi tnh c phn t ,

-.

0
Bc 5

Bc 4

Bc 3

Bc 2

0
0

Bc 1
C
s

Hnh 3-7. Quy trnh tnh bng phng n

Song
,

song

vi

qua
{

( ),

tr nh

gii

cng

-}, ta lu li

thc
,

truy

- l ch s

hi,

ti

mi

m ti ,

bc

tnh

- t cc tiu,

tc l:
,

( ),

-}

(3.15)

Sau khi qu trnh tnh ton kt thc, in ra php tam gic phn nh nht i vi a gic
, - a vn v vic in ra php tam gic
, ta s s da vo phn t
phn i vi hai a gic

. iu ny c th c thc hin n gin

bng mt th tc quy.
Ci t

TRIANGULATION_DP.PAS Phn hoch tam gic

{$MODE OBJFPC}
program Triangulation;
const
max = 200;
var
x, y: array[1..max] of Real;
f: array[1..max, 1..max] of Real;
trace: array[1..max, 1..max] of Integer;
n: Integer;
procedure Enter; //Nhp d liu
var
i: Integer;
begin
ReadLn(n);
for i := 1 to n do ReadLn(x[i], y[i]);
end;
function d(i, j: Integer): Real; H{m o khong cch P[i] P[j]
begin
Result := Sqrt(Sqr(x[i] - x[j]) + Sqr(y[i] - y[j]));
end;

//Hm cc tiu ho target := Min(target, value)

function Minimize(var target: Real; value: Real): Boolean;


begin
Result := value < target; //Tr v True n u target c cp nht
if Result then target := value;
end;
procedure Optimize; //Gii cng thc truy hi
var
m, i, j, k: Integer;
begin
for i := 1 to n - 2 do
f[i, i + 2] := 0;
for m := 3 to n - 1 do
for i := 1 to n - m do
begin //Tnh f[i, i + m]
j := i + m;
Tr ng hp k = i + 1

f[i, j] := d(i + 1, j) + f[i + 1, j];


trace[i, j] := i + 1;
Tr ng hp i + 1 < k < j - 1

for k := i + 2 to j - 2 do
if Minimize(f[i, j],
d(i, k) + d(k, j) + f[i, k] + f[k, j]) then
trace[i, j] := k;
Tr ng hp k = j - 1

if Minimize(f[i, j], d(i, j - 1) + f[i, j - 1]) then


trace[i, j] := j - 1;
end;
end;
//Vi i + 1 < j, th tc n{y in ra ng cho P[i] P[j]

procedure WriteDiagonal(i, j: Integer);


begin
if i + 1 < j then
WriteLn('P[', i, '] - P[', j, '] = ', d(i, j):0:2);
end;
//Truy v t b ng quy, in ra c|ch tam gi|c ph}n a gi|c P i j

procedure TraceRecursively(i, j: Integer);


var
k: Integer;
begin
if j <= i + 2 then Exit;
a gi|c c 3 nh th khng cn phn ho ch
k := trace[i, j]; //Ly v t
WriteDiagonal(i, k);
WriteDiagonal(k, j);
TraceRecursively(i, k); //In ra cch phn ho ch a gi|c P i k
TraceRecursively(k, j); //In ra cch phn ho ch a gi|c P k j
end;
procedure PrintResult; //In k t qu
begin
WriteLn('Minimum triangulation: ', f[1, n]:0:2);
TraceRecursively(1, n);
end;

begin
Enter;
Optimize;
PrintResult;
end.

3.3.5. Php nhn dy ma trn


Vi ma trn

+ kch thc

v ma trn

php nhn hai ma trn c ma trn

+ kch thc

+ kch thc

. Ngi ta c

. Mi phn t ca ma

trn C c tnh theo cng thc:

V d vi
kch thc

l ma trn kch thc

(3.16)

l ma trn kch thc

(Hnh 3-8).

36

14

34

14

25 100 21

10

11

12

54

22

41 164 33

Hnh 3-8. Php nhn hai ma trn

Ta xt thut ton nhn hai ma trn (

) v (

for i := 1 to p do
for j := 1 to r do
begin
c[i, j] := 0;
for k := 1 to q do
c[i, j] := c[i, j] + a[i, k] * b[k, j];
end;

):

th

s l ma trn

Ph tn thc hin php nhn ma trn c th nh gi qua s ln thc hin php nhn s
hc, nhn hai ma trn (

) v (

) chng ta cn

php nhn*.

Php nhn ma trn khng c tnh cht giao hon nhng c tnh cht kt hp:
(
Vy nu

l ma trn cp

tnh (

l ma trn cp

) , php tnh (

(3.17)
v

l ma trn cp

) cho ma trn kch thc

th:

sau

php

nhn s hc, sau nhn tip vi C c ma trn kt qu kch thc

sau

php nhn s hc. Vy tng s php nhn s hc phi thc hin s l


216.

tnh (

), php tnh (

nhn s hc, ly

) cho ma trn kch thc

sau

php

nhn vi ma trn ny c ma trn kt qu kch thc

sau

php nhn s hc. Vy tng s php nhn s hc phi thc hin s l


288.
V d ny cho chng ta thy rng trnh t thc hin c nh hng ln ti chi ph. Vn t
ra l tnh s ph tn t nht khi thc hin php nhn mt dy cc ma trn:

Trong :
l ma trn kch thc
l ma trn kch thc

l ma trn kch thc


Input

Dng 1 cha s nguyn dng

Dng 2 cha
(

s nguyn dng

cch nhau t nht mt du cch

Output
Cho bit phng n nhn ma trn ti u v s php nhn phi thc hin

* nhn hai ma trn, c mt s thut ton tt hn, chng hn thut ton Strassen
Coppersmith-Winograd (
n gin nht.

) hay thut ton

). Nhng n gin cho bi ton ny, chng ta dng thut ton nhn ma trn

Sample Input
6
9 5 3 2 4 7 8

Sample Output
The best solution:
((M[1].(M[2].M[3])).((M[4].M[5]).M[6]))
Number of numerical multiplications: 432

Thut ton
Cch gii ca bi ton ny gn ging nh bi ton tam gic phn: Trc ht, nu dy ch c
mt ma trn th chi ph bng 0, tip theo, chi ph nhn mt cp ma trn c th tnh c
ngay. Bng vic ghi nhn chi ph ca php nhn hai ma trn lin tip ta c th s dng
nhng thng tin ti u ho chi ph nhn nhng b ba ma trn lin tip C tip tc
nh vy cho ti khi ta tnh c ph tn nhn
Gi ,

ma trn lin tip.

- l s php nhn s hc ti thiu cn thc hin nhn on ma trn lin tip:


(3.18)

Vi mt cch nhn ti u dy ma trn


cng, chng hn

, ta quan tm ti php nhn ma trn cui

cui cng c tnh bng tch ca ma trn

v ma trn
(3.19)

Trong

l ma trn to thnh qua php nhn dy ma trn t

to thnh qua php nhn dy ma trn t

ti

vi mt ch s

V php kt hp chng ta ang xt l ti u tnh

l ma trn

no .

, nn chi ph ca php kt hp

ny s bng tng ca ba i lng:

Chi ph nhn ti u dy ma trn t

Chi ph nhn ti u dy ma trn t

ti

Chi ph tnh tch

c ma trn
c ma trn

(
(

-)
,

-)

Ta c cng thc truy hi v cng thc tnh vt:


,

{ ,

{ ,

,
-

}
-

(3.20)

C s quy hoch ng:


,

(3.21)

Cch truy vt in ra php nhn ti u

, vi

s quy v vic in ra php nhn ti u

-. iu ny c th thc hin bng mt th tc quy.

Ci t

MATRIXCHAINMULTIPLICATION_DP.PAS Nhn ti u dy ma trn

{$MODE OBJFPC}
program MatrixChainMultiplication;
const
maxN = 100;
maxSize = 1000;
maxValue = maxN * maxSize * maxSize * maxSize;
var
a: array[0..maxN] of Integer;
f: array[1..maxN, 1..maxN] of Int64;
t: array[1..maxN, 1..maxN] of Integer;
n: Integer;
procedure Enter; //Nhp d liu
var
i: Integer;
begin
ReadLn(n);
for i := 0 to n do Read(a[i]);
end;
procedure Optimize; //Gii cng thc truy hi
var
m, i, j, k: Integer;
Trial: Int64;
begin
for i := 1 to n do
f[i, i] := 0;
for m := 1 to n - 1 do
for i := 1 to n - m do
begin //Tnh f[i, i + m]
j := i + m;
f[i, j] := maxValue;
for k := i to j - 1 do //Th cc v tr phn ho ch k
begin
Trial := f[i, k] + f[k + 1, j] + Int64(a[i - 1]) * a[k] * a[j];
if Trial < f[i, j] then //Cc tiu ho f[i, j v{ l u v t
begin
f[i, j] := Trial;
t[i, j] := k;
end;
end;
end;
end;
procedure Trace(i, j: Integer); //In ra cch nhn ti u d~y M i j
begin
if i = j then Write('M[', i, ']')
else
begin
Write('(');
Trace(i, t[i, j]);
Write('.');
Trace(t[i, j] + 1, j);

Write(')');
end;
end;
procedure PrintResult; //In k t qu
begin
WriteLn('The best solution: ');
Trace(1, n);
WriteLn;
WriteLn('Number of numerical multiplications: ', f[1, n]);
end;
begin
Enter;
Optimize;
PrintResult;
end.

3.3.6. Du lch ngTy


Bn l ngi thng cuc trong mt cuc thi do mt hng hng khng ti tr v phn thng
l mt chuyn du lch do bn tu chn. C

thnh ph v chng c nh s t 1 ti

theo v tr t Ty sang ng (khng c hai thnh ph no cng kinh ), c


hai chiu do hng qun l, mi tuyn bay ni gia hai thnh ph trong s

tuyn bay

thnh ph

cho. Chuyn du lch ca bn phi xut pht t thnh ph 1, bay theo cc tuyn bay ca hng
ti thnh ph

v ch c bay t Ty sang ng, sau li bay theo cc tuyn bay ca

hng v thnh ph 1 v ch c bay t ng sang Ty. Hnh trnh khng c thm bt k


thnh ph no qu mt ln, ngoi tr thnh ph 1 l ni bt u v kt thc hnh trnh.
Yu cu t ra l tm hnh trnh du lch qua nhiu thnh ph nht.
Input

Dng 1 cha s thnh ph ( ) v s tuyn bay ( ),


dng tip, mi dng cha thng tin v mt tuyn bay: gm ch s hai thnh ph
tng ng vi tuyn bay .

Output
Hnh trnh ti u tm c hoc thng bo rng khng th thc hin c hnh trnh theo
yu cu t ra.

Sample Input
5 6
1 2
2 3
3 4
4 5
1 4
2 5

Sample Output
The best tour:
Number of cities: 4
1 2 5 4 1

Thut ton
(

Ta c th t mt m hnh th

) vi tp nh

l tp cc thnh ph v tp cnh

l tp cc tuyn bay. Bi ton ny nu khng c rng buc v hnh trnh Tyng-Ty th


c th quy dn v bi ton tm chu trnh Hamilton (Hamilton Circuit) trn th . Bi ton
tm chu trnh Hamilton thuc v lp bi ton cho ti nay cha c thut ton hiu qu vi
phc tp a thc gii quyt, nhng bi ton ny nh c rng buc v hng i nn chng
ta c th xy dng mt thut ton cho kt qu ti u vi phc tp (

). Ti IOI93*, bi

ton du lch ngTy ny c coi l bi ton kh nht trong s bn bi ton ca thi.


D thy rng hnh trnh i qua nhiu thnh ph nht cng l hnh trnh i bng nhiu tuyn
bay nht m khng c thnh ph no thm qua hai ln ngoi tr thnh ph 1 l ni bt u
v kt thc hnh trnh. Vi hai thnh ph

trong

, ta xt cc ng bay xut

pht t thnh ph , bay theo hng Ty ti thnh ph 1 ri bay theo hng ng ti thnh
ph sao cho khng c thnh ph no b thm hai ln.

Nu tn ti ng bay nh vy, ta xt ng bay qua nhiu tuyn bay nht, k hiu


(
) v gi , - l s tuyn bay dc theo ng bay ny.
Nu khng tn ti ng bay tho mn iu kin t ra, ta coi , -

Ch rng chng ta ch quan tm ti cc ,

- vi

, tc l thnh ph pha Ty thnh

ph m thi.

N
W

E
S

Hnh 3-9. ng bay (

Nu tnh c cc , - th tua du lch cn tm s gm cc tuyn bay trn mt ng bay


(
) no ghp thm tuyn bay ( ), tc l s tuyn bay (nhiu nht) trn tua du
lch ti u cn tm s l
,
Vi

* ,

-+

. Vn by gi l phi xy dng cng thc tnh cc

-.
, xt ng bay (

), ng bay ny s bay qua mt thnh ph

trc khi kt thc ti thnh ph . C hai kh nng xy ra:

*The 5th International Olympiad in Informatics (Mendoza Argentina)

no

), khi ng bay
Thnh ph
nm pha ng (bn phi) thnh ph (
(
) c th coi l ng bay (
) ghp thm tuyn bay ( ). Vy trong
trng hp ny ,

( )

), khi ng bay (
nm pha ty (bn tri) thnh ph (
) theo chiu ngc li ri ghp thm tuyn bay (
c th coi l ng bay (
Thnh ph

Vy trong trng hp ny ,

( ),

).

Hnh 3-10. ng bay (

-, ta suy ra cng thc truy hi:


,

Trong cc ch s
( ),

) v hai trng hp v v tr thnh ph

V tnh cc i ca ,

Cc gi tr

( ),

tho mn

-}

(3.22)
( ),

v (

) l mt tuyn bay.

- trong cng thc truy hi (3.22) c tnh bi:


( ),

,
,

(3.23)

Cc phn t ca bng

s c tnh theo tng hng t trn xung v trn mi hng th cc


phn t s c tnh t tri qua phi. Cc phn t hng 1 ca bng ( , -) s c tnh
trc lm c s quy hoch ng.
Bi ton tnh cc gi tr ,

- li l mt bi ton quy hoch ng: ,

- theo nh ngha l

s tuyn bay trn ng bay Tyng qua nhiu tuyn bay nht t 1 ti . ng bay ny
s bay qua thnh ph

no trc khi kt thc ti thnh ph . Theo nguyn l bi ton

con ti u, ta c cng thc truy hi:


,
vi cc thnh ph

tho mn:

* ,
, ,

C s quy hoch ng tnh cc ,

-+

(3.24)
v (

- chnh l ,

) l mt tuyn bay.
-

(s tuyn bay trn ng bay

Tyng qua nhiu tuyn bay nht t 1 ti 1)


Quy trnh gii c th tm tt qua hai bc chnh:

t ,

v tnh cc ,

-(

) bng cng thc (3.24)

Dng cc ,

- va tnh c lm c s, tnh cc ,

-(

) bng cng thc

(3.22)
Song song vi vic tnh mi ,

-, chng ta lu tr li
, - l thnh ph ng lin
). Vic ch ra tua du lch ti u s quy v vic
trc thnh ph trn ng bay (
) no , vic ch ra ng bay (
) c th quy v
ch ra mt ng bay (
,
vic ch ra ng bay (
, - ln hn hay nh hn .
gi tr

-) hoc ng bay (

Ci t

BITONICTOUR_DP.PAS Du lch ngTy

{$MODE OBJFPC}
program TheLongestBitonicTour;
const
max = 1000;
type
TPath = record
nCities: Integer;
c: array[1..max] of Integer;
end;
var
a: array[1..max, 1..max] of Boolean;
f: array[1..max, 1..max] of Integer;
trace: array[1..max, 1..max] of Integer;
p, q: TPath;
n: Integer;
LongestTour: Integer;
procedure Enter; //Nhp d liu
var
i, m, u, v: Integer;
begin
FillChar(a, SizeOf(a), False); a u, v True u,v l{ mt tuy n bay
ReadLn(n, m);
for i := 1 to m do
begin
ReadLn(u, v); //Tuy n bay hai chiu: a[u, v] = a[v, u]
a[u, v] := True;
a[v, u] := True;
end;
end;
//target := Max(target, value), tr v True n u target c cc i ho.

function Maximize(var target: Integer; value: Integer): Boolean;


begin
Result := value > target;
if Result then target := value;
end;
procedure Optimize; //Gii cng thc truy hi
var
i, j, k: Integer;

) tu theo

begin
//Tnh cc f[1, j]

f[1, 1] := 0; C s QH tnh cc f[1, j]


for j := 2 to n do
begin //Tnh f[1, j]
f[1, j] := -1;
for k := 1 to j - 1 do
if a[k, j] and (f[1, k] <> -1) and
Maximize(f[1, j], f[1, k] + 1) then
trace[1, j] := k; L u v t mi khi f , j c cc i ho
end;
ng c|c f , j l{m c s QH , tnh c|c f i, j

for i := 2 to n - 1 do
for j := i + 1 to n do
begin
f[i, j] := -1;
for k := i + 1 to j - 1 do //k n m pha ng i
if a[k, j] and (f[i, k] <> -1) and
Maximize(f[i, j], f[i, k] + 1) then
trace[i, j] := k;
for k := 1 to i - 1 do //k n m pha Ty i
if a[k, j] and (f[k, i] <> -1) and
Maximize(f[i, j], f[k, i] + 1) then
trace[i, j] := k;
end;
end;
procedure FindPaths; //Truy v t tm ng
var
i, j, k, t: Integer;
begin
//Tnh LongestTour l s tuy n bay nhiu nht tr n ng bay k n vi mi k

LongestTour := -1;
for k := 1 to n - 1 do
if a[k, n] and Maximize(LongestTour, f[k, n]) then
i := k;
if LongestTour = -1 then Exit;
j := n;
//Tua du lch cn tm s l g m cc tuyn ay trn ng ay 1j=n g p t m tuyn (i, n)
Ch ng ta tm ng bay ngT}y p i v{ q j gm cc tuy n bay tr n ng bay i j
p.nCities := 1; p.c[1] := i; L u tr thnh ph cui cng ca ng p
q.nCities := 1; q.c[1] := j; L u tr thnh ph cui cng ca ng q

repeat
if i < j then //Truy v t ng bay i j
with q do
begin
k := trace[i, j]; //Xt thnh ph k ng lin tr c j
Inc(nCities); c[nCities] := k;
a k v{o ng q
j := k;
end
else //Truy v t ng bay j i
with p do
begin
k := trace[j, i]; //Xt thnh ph k ng lin tr c i
Inc(nCities); c[nCities] := k;
a k v{o ng p
i := k;
end;

until i = j; //Khi i=j th chc chn i = j = 1


end;
procedure PrintResult; //In k t qu
var
i: Integer;
begin
if LongestTour = -1 then
WriteLn('NO SOLUTION!')
else
begin
WriteLn('The best tour: ');
WriteLn('Number of cities: ', LongestTour + 1);
in ra tua du lch ti u, ta s in ghp ng:
In ng c ng p c ng i T}y ng i
In xu i ng q c ng i ngT}y n

for i := p.nCities downto 1 do Write(p.c[i], ' ');


for i := 1 to q.nCities do Write(q.c[i], ' ');
end;
end;
begin
Enter;
Optimize;
FindPaths;
PrintResult;
end.

3.3.7. Thut ton Viterbi


Thut ton Viterbi c xut bi Andrew Viterbi nh mt phng php hiu chnh li
trn ng truyn tn hiu s. N c s dng gii m chp s dng trong in thoi di
ng k thut s (CDMA/GSM), ng truyn v tinh, mng khng dy, v.v Trong ngnh
khoa hc my tnh, thut ton Viterbi c s dng rng ri trong Tin-Sinh hc, x l ngn
ng t nhin, nhn dng ting ni. Khi ni ti thut ton Viterbi, khng th khng k n
mt ng dng quan trng ca n trong m hnh Markov n (Hidden Markov Models HMMs) tm dy trng thi ti u i vi mt dy tn hiu quan st c.
Vic trnh by c th mt m hnh thc t c ng dng ca thut ton Viterbi l rt di dng,
chng ta s tm hiu thut ton ny qua mt bi ton n gin hn qua hnh dung
c cch thc thut ton Viterbi tm ng i ti u trn li nh th no.
Bi ton
Mt dy chuyn lp rp t c mt robot v
phn trong mt chic t nh s t 1 ti
(
) theo ng th t ny (

dng c nh s t 1 ti . C tt c

. Mi chic t phi c lp rp t b phn


). Bit c nhng thng tin sau:

Ti mi thi im, robot ch c th cm c 1 dng c.

Ti thi im bt u, robot khng cm dng c g c v phi chn mt trong s


c cho, thi gian chn khng ng k.

loi b

dng

Khi c dng c, robot s s dng n lp mt b phn trong dy , bit thi gian


(
)
Robot lp b phn loi bng dng c th l

Sau khi lp xong mi b phn, robot c php i dng c khc lp b phn tip
theo, bit thi gian i t dng c sang dng c l

.(

c th khc

lun

bng 0).
Hy tm ra quy trnh lp rp t mt cch nhanh nht.
Input

Dng 1: Cha ba s nguyn dng

Dng 2: Cha s nguyn dng

)
(

dng tip theo, dng th cha

s nguyn, s th l

dng tip theo, dng th cha

s nguyn, s th

)
(

Output
Quy trnh lp rp t nhanh nht
Sample Input
3 4 6
1 2 3 2 3 4
0 1 2
3 0 4
5 6 0
8 8 1 5
8 1 8 8
1 8 8 5

Sample Output
Component Tool
--------------1
3
2
2
3
1
2
2
3
1
4
1
Time for assembling: 23

Thut ton
Gi ,

- l thi gian t nht lp rp ln lt cc b phn

dng lp b phn u tin trong dy (

m dng c

) l dng c . Nu dng c dng lp b phn

tip theo (
) l dng c th thi gian t nht lp ln lt cc b phn
, - s c tnh bng:
: ,

Thi gian lp b phn

Cng vi thi gian i t dng c sang dng c : ,

Cng vi thi gian t nht lp rp ln lt cc b phn


phn
c lp bng dng c : ,

, trong b

V chng ta mun ,
lp

- l nh nht c th, chng ta s th mi kh nng chn dng c


v chn phng n tt nht cc tiu ho , -. T suy ra cng thc truy hi:
,

Bng phng n

* ,

l bng hai chiu

tnh qua cc phn t hng

hng,

-+

ct. Trong cc phn t hng

(3.25)
s c

, nh vy ta s phi tnh nhng phn t hng ca bng

lm c s quy hoch ng. Theo nh ngha, , - l thi gian (t nht) lp duy nht mt
,
-.
b phn bng dng c nn suy ra , Song song vi vic tnh cc phn t bng
t gi tr nh nht ti
,

bng cng thc (3.25), mi khi tnh c ,

no , chng ta t:

* ,

ch ra rng phng n ti u tng ng vi ,


c

- lp b phn

-+

(3.26)

- s phi chn dng c tip theo l dng

Sau khi tnh c tt c cc phn t ca bng , ta quan tm ti cc phn t trn hng 1.


Theo nh ngha , - l thi gian t nht lp hon chnh mt chic t vi dng c u
tin c s dng l . Cng tng t trn, chng ta mun lp hon chnh mt chic t
trong thi gian ngn nht nn cng vic cn li l th mi kh nng chn dng c u tin
- nh nht, ,
- chnh l thi gian ngn nht lp hon
v chn ra dng c c ,
chnh mt chic t. T c ch lu vt, ta c dng c tip theo cn s dng lp
l
,
-, dng c cn s dng lp
,
-, Nhng cng on
l
chnh trong vic thit k mt thut ton quy hoch ng hon tt, bao gm: Dng cng
thc truy hi, tm c s quy hoch ng, tm c ch lu vt v truy vt.
Ci t
Nhn vo cng thc truy hi (3.25) tnh cc ,
t trn hng

-, c th nhn thy rng vic tnh phn

ch cn da vo cc phn t trn hng

. Vy th ti mi bc tnh mt

hng ca bng phng n, ta ch cn lu tr hai hng lin tip di dng hai mng mt
chiu

v : mng

tng ng vi hng va c tnh (hng

) v mng

tng ng vi hng lin trc sp c tnh (hng ), cng thc truy hi dng mng
mng

tnh

s c vit li l:
,-

* ,

Sau khi tnh xong mt hng, hai mng

, -+

c i vai tr cho nhau v qu trnh tnh

(3.27)

c lp li. Cui cng chng ta vn lu tr c hng 1 ca bng phng n v t truy


vt tm ra phng n ti u.
Mo nh ny khng nhng tit kim b nh cho bng phng n m cn lm tng tc ng
k qu trnh tnh ton so vi phng php tnh trc tip trn mng hai chiu . Tc c
ci thin nh hai nguyn nhn chnh:

Vic truy cp phn t ca mng mt chiu nhanh hn vic truy cp phn t ca mng
hai chiu v php tnh a ch c thc hin n gin hn, hn na nu bn bt ch
kim tra trn phm vi (range checking) khi dch chng trnh, truy cp phn t mng
mt chiu ch cn kim tra phm vi mt ch s trong khi truy cp phn t mng hai
chiu phi kim tra phm vi c hai ch s.

Nu dng hai mng mt chiu tnh xoay ln nhau, vng b nh ca c hai mng b
c/ghi nhiu ln v b vi x l s c c ch np c hai mng ny vo vng nh cache
ngay trong b vi x l, vic c/ghi d liu s khng qua RAM na nn t tc
nhanh hn nhiu. (S chm chp ca RAM so vi cache cng c th so snh nh tc
ca a cng v RAM).

Bn c th ci t th phng php tnh trc tip mng hai chiu v phng php tnh xoay
vng hai mng mt chiu so snh tc trn cc b d liu ln. thy r hn s khc
bit v tc , c th i yu cu ca bi ton ch l a ra thi gian ngn nht lp rp m
khng cn a ra phng n thc thi, khi mng hai chiu
na.

VITERBI_DP.PAS Lp rp t

{$MODE OBJFPC}
program ViterbiAlgorithm;
const
maxN = 500;
maxM = 500;
maxT = 500;
maxTime = 500;
Infinity = maxT * maxTime + 1;
type
TLine = array[1..maxN] of Integer;
PLine = ^TLine;
var
a: array[1..maxN, 1..maxN] of Integer;
b: array[1..maxN, 1..maxM] of Integer;
o: array[1..maxT] of Integer;
x, y: PLine;
trace: array[1..maxT, 1..maxN] of Integer;
n, m, t: Integer;
MinTime: Integer;
Tool: Integer;
procedure Enter; //Nhp d liu
var
i, j, k: Integer;
begin
ReadLn(n, m, t);
for i := 1 to t do Read(o[i]);
ReadLn;
for i := 1 to n do
begin
for j := 1 to n do Read(a[i, j]);
ReadLn;
end;
for i := 1 to n do
begin
for k := 1 to m do Read(b[i, k]);
ReadLn;
end;
end;

cng khng cn dng n

//target := Min(target, value); Tr v True n u target c cc tiu ho

function Minimize(var target: Integer; value: Integer): Boolean;


begin
Result := value < target;
if Result then target := value;
end;
procedure Optimize; //Quy ho ch ng
var
i, j, k: Integer;
temp: PLine;
begin
New(x); New(y);
try
for i := 1 to n do C s quy ho ch ng: x^ := hng t ca bng ph ng |n
x^[i] := b[i, o[t]];
for k := t - 1 downto 1 do
begin
ng x^ tnh y^ dng f k , tnh f k,
for i := 1 to n do
begin
y^[i] := Infinity;
for j := 1 to n do
if Minimize(y^[i], a[i, j] + x^[j]) then
trace[k, i] := j; //Cc tiu ho y^[i] k t hp l u v t
Inc(y^[i], b[i, o[k]]);
end;
temp := x; x := y; y := temp;
o hai con tr o vai tr x v y
end;
//x^ gi }y l{ h{ng 1 ca bng ph ng |n, tm phn t nh nht ca x^ v dng c u ti n c dng

MinTime := Infinity;
for i := 1 to n do
if x^[i] < MinTime then
begin
MinTime := x^[i];
Tool := i;
end;
finally
Dispose(x); Dispose(y);
end;
end;

procedure PrintResult; //In k t qu


var
k: Integer;
begin
WriteLn('Component Tool');
WriteLn('---------------');
for k := 1 to t do
begin
WriteLn(o[k]:5, Tool:9); //In ra dng c Tool dng lp o[k]
Tool := trace[k, Tool]; //Chuyn sang dng c k ti p
end;
WriteLn('Time for assembling: ', MinTime);
end;
begin

Enter;
Optimize;
PrintResult;
end.

Ngi ta thng pht biu thut ton Viterbi trn m hnh th: t th c hng gm
nh, tp cc nh ny c chia lm lp, mi lp c ng

nh. Cc cung ca th

ch ni t mt nh n mt nh khc thuc lp k tip. Moi nh va moi cung cua o thi


eu co gan mot trong so (chi ph ). Trong so (chi ph ) cua mot ng i tren o thi bang tong
trong so cac nh va cac cung i qua. Thut ton Viterbi chnh l tm ng i ngn nht
(co chi ph t nhat) tren li t lp 1 ti lp . Trong v du cu the nay, trong so cung noi nh
cua lp vi nh cua lp
ch nh la , - va trong so nh cua lp ch nh la
,

-. Thuat toan Viterbi can thi gian

) e t nh bang phng an va can thi gian

( ) e truy vet t m ra nghiem. Hnh 3-11 mo ta cach thc t nh bang phng an va truy vet
tren v du cu the cua e bai.
1
25

24

23

n=3

o
1

6
20

16

25

2
3

12

18

24

1
1

14

10

19

3
6

16

0
5

t=6
Gii cng thc truy hi

Truy vt

Hnh 3-11. Thut ton Viterbi tnh ton v truy vt

Mt bi ton quy hoch ng c th c nhiu cch tip cn khc nhau, chn cch no l tu
theo yu cu bi ton sao cho thun tin. ieu quan trong nhat e giai mot bai toan quy
hoach ong ch nh la phi nh n ra c ban chat e quy cua bai toan va t m ra cong thc truy
hoi e giai. Viec nay khong co phng phap chung nao c m hon ton da vo s kho lo
v kinh nghim ca bn - nhng k nng ch c c nh luyn tp.

Bi tp 3-1.
Cho ba s nguyn dng ,
khng qu

), hy cho bit c bao nhiu s t nhin c

ch s m tng cc ch s ng bng , ng thi cho bit nu mang tt c cc

s sp xp theo th t tng dn th s ng th
Gi : Tm cng thc truy hi tnh ,

l s no.

- l s cc s c

ch s m tng cc ch s ng

bng .
Bi tp 3-2.
Cho dy s nguyn dng

chn ra mt s phn t trong dy

)(

) v mt s

m cc phn t c chn c tng ng bng

. Hy

Gi : Tm cng thc truy hi tnh , - l ch s nh nht tho mn: tn ti cch chn trong
dy

, -

ra mt s phn t c tng ng bng .

Bi tp 3-3.
(

Cho dy s t nhin

). Ban u cc phn t ca

c t lin tip theo

ng th t cch nhau bi du ?:
Yu cu: Cho trc s nguyn

, hy tm cch thay cc du ? bng du cng hay du tr

c mt biu thc s hc cho gi tr l


V d: Ban u dy

. Bit rng

, vi

s c phng n

nh s t 1 ti

Bi tp 3-4. Cho mt li vung kch thc

), cc hng ca li c

v cc ct ca li c nh s t 1 ti , trn mi ca li ghi mt s

nguyn c gi tr tuyt i khng qu 1000. Ngi ta mun tm mt cch i t ct 1 ti ct


ca li theo quy tc: T mt ( ) ch c php i sang mt trong cc ct bn phi c
nh chung vi (

). Hy ch ra cch i m tng cc s ghi trn cc i qua l ln nht.


7

Bi tp 3-5.
Lp trnh gii bi ton ci ti vi kch thc d liu:

v gii hn b

nh 10MB.
Gi : Vn s dng cng thc truy hi nh v d trong b{i, nh ng thay i c ch l u tr. Gii
cng thc truy hi ln , kh ng l u tr ton b bng ph ng |n m c cch 100 hng mi
l u l i h{ng Sau vi hai h{ng c l u tr lin ti p th ly h{ng tr n l{m c s , gii cng
thc truy hi ln

tnh qua 00 h{ng n h{ng d i, nh ng ln n{y l u tr ton b nhng

h{ng tnh c truy v t.

Bi tp 3-6. (Dy con chung di nht Longest Common Subsequence-LCS)


Xu k t

gi l xu con ca xu k t

c xu . Cho hai xu k t

di ln nht l xu con ca c
xu

nu c th xo bt mt s k t trong xu

cn tm l

v . V d:

). Tm xu
,

c
th

Gi : Tm cng thc truy hi tnh ,


v

- l di xu con chung di nht ca hai xu

Bi tp 3-7.
Mt s nguyn dng
s ca
c

gi l con ca s nguyn dng

c . Cho hai s nguyn dng

sao cho gi tr ca

nu ta c th xo bt mt s ch

) hy tm s

l ln nht c th. V d vi

l con ca

th
Bi tp 3-8.
Mt xu k t

gi l cha xu k t

nu nh c th xo bt mt s k t trong xu

c xu . Mt xu k t gi l i xng (palindrome) nu n khng thay i khi ta vit cc


k t trong xu theo th t ngc li. Cho mt xu k t
tm xu i xng

c di khng qu 1000, hy

cha xu v c di ngn nht c th.

Bi tp 3-9.
C

loi tin giy nh s t 1 ti , t giy bc loi

dng

c mnh gi l l mt s nguyn

). Hi mun mua mt mn hng gi l

) th

c bao nhiu cch tr s tin bng nhng loi giy bc cho, nu tn ti cch tr, cho
bit cch tr phi dng t t tin nht.
Bi tp 3-10.
Cho

qun c dominos xp dng ng theo hng ngang v c nh s t 1 n . Qun

c dominos th c s ghi trn l

. Xem hnh v:

Bit rng

v s ghi di l

. Cho php lt ngc cc qun dominos. Khi

qun dominos th b lt, n s c s ghi trn l

v s ghi di l

. Vn t ra

l hy tm cch lt cc qun dominos sao cho chnh lch gia tng cc s ghi hng trn v
tng cc s ghi hng di l ti thiu. Nu c nhiu phng n lt tt nh nhau, th ch ra
phng n phi lt t qun nht.
Nh v d trn th s lt hai qun dominos th 3 v th 6. Khi :

Tng cc s hng trn:


Tng cc s hng di:
Bi tp 3-11.
{

Xt bng

} kch thc

, cc hng v cc ct c nh ch s A, B, C, D. Trn 16

ca bng, mi ghi 1 k t A hoc B hoc C hoc D.


A B C D
A A B B
C D A B
B C B A
B D D D

A
B
C
D
Cho xu
k t

ch gm cc ch ci *
-. V d:
bi k t ,
*

Yu cu: Cho trc mt k t

+. (

). Xt php co ( ): thay

, p dng lin tip 3 ln ( ) s c:

+, hy ch ra th t thc hin

php co k

t cn li cui cng trong l .


Bi tp 3-12.
Bn c

vic cn lm nh s t 1 ti , vic th cn lm lin tc trong

v nu bn hon thnh vic th khng mun hn thi im

n v thi gian

, bn s thu c s tin l

. Bn bt u t thi im 0 v khng c php lm mt lc hai vic m phi thc hin


cc cng vic mt cch tun t. Hy chn ra mt s vic v ln k hoch hon thnh cc vic
chn sao cho tng s tin thu c l nhiu nht. Bit rng

v cc gi tr

l s nguyn dng khng qu


Bi tp 3-13.
(

Cho dy s nguyn
dng

) (

| |

) v mt s nguyn

, hy chn ra mt dy con gm nhiu phn t nht ca

c tng chia ht

cho .
Bi tp 3-14.
Cng ty trch nhim hu hn "Vui v" c
c nh gi vui tnh l
c cng ty th

cn b nh s t 1 ti

v c mt th trng trc tip

). Cn b th

, gi thit rng nu l gim

. Bn cn gip cng ty mi mt nhm cn b n d d tic Nhng

ngi thch a sao cho tng nh gi vui tnh ca nhng ngi d tic l ln nht, sao
cho trong s nhng ngi c mi khng ng thi c mt nhn vin cng th trng
trc tip ca ngi .

Bi 4. Tham lam
Tham lam (greedy) l mt phng php gii cc bi ton ti u. Cc thut ton tham lam
da vo s nh gi ti u cc b a ph ng (local optimum) a ra quy t nh tc th
ti mi bc la chn, vi hy vng cui cng s tm ra c phng n ti u tng th
(global optimum).
Thut ton tham lam c trng hp lun tm ra ng phng n ti u, c trng hp
khng. Nhng trong trng hp thut ton tham lam khng tm ra ng phng n ti u,
chng ta thng thu c mt phng n kh d chp nhn c.
Vi mt bi ton c nhiu thut ton gii quyt, thng thng thut ton tham lam c tc
tt hn hn so vi cc thut ton ti u tng th.
Khc vi cc k thut thit k thut ton nh chia tr, lit k, quy hoch ng m chng ta
bit, rt kh a ra mt quy trnh chung tip cn bi ton, tm thut ton cng nh
ci t thut ton tham lam. Nu ni v cch ngh, ti ch c th a ra hai kinh nghim:

Th tm mt thut ton ti u tng th (v d nh quy hoch ng), sau nh gi li


thut ton, nhn li mi bc ti u v t cu hi Liu ti bc ny c cn phi lm
n th khng?.

Hoc th ngh xem nu nh khng c my tnh, khng c khi nim g v cc chin lc


ti u tng th th gc con ngi, chng ta s a ra gii php nh th no?

4.1. Gii thut tham lam


Gi s c

loi tin giy, loi tin th c mnh gi l

t tin nht mua mt mt hng c gi l

(ng). Hy ch ra cch tr dng t

ng.

Bi ton ny l mt bi ton c th gii theo nhiu cch


Nu c cc loi tin nh h thng tin t ca Vit Nam: 1 ng, 2 ng, 5 ng, 10 ng, 20
ng, 50 ng, 100 ng, 200 ng, 500 ngth tr mn hng gi 9 ng:

Mt ngi my c ci t chin lc tm kim vt cn s duyt t hp ca tt c cc


t tin v tm t hp gm t t tin nht c tng mnh gi l 9 ng. Vn s xy ra
nu mn hng khng phi gi 9 ng m 9 t ng th ngi my s ngh n khi ht
in th thi.

Mt ngi my khc c ci t chin lc chia tr ( quy hoc quy hoch ng)


s ngh theo cch khc, tr 9 ng d nhin khng cn dng n nhng t tin mnh
gi ln hn 9. Bi ton tr thnh i 9 ng ra nhng t tin 1 ng, 2 ng v 5 ng.
Nu c mt t

ng trong phng n ti u th vn cn li l i

v ba bi ton con (vi

ng, quy

), gii chng v chn phng n tt nht trong ba li

gii. Khi m s tin cn quy i rt ln, gii hn v thi gian v b nh s lm cho gii
php ca ngi my ny bt kh thi.

By gi hy th ngh theo mt cch rt con ngi, khi cc b ni tr i mua sm, h


chng c my tnh, khng c khi nim g v thut ton chia tr, quy hoch ng, vt
cn, (m c bit h cng chng dng). C iu tr 9 ng, chc chn h s tr bng
1 t 5 ng v 2 t 2 ng. Cch lm ca h rt n gin, mi khi rt mt t tin ra tr,
h quy t nh tc thi bng cch ly ngay t tin mnh gi cao nht khng vt qu gi
tr cn tr, m khng cn n hu qu ca s quyt nh .

Xt v gii php ca con ngi trong bi ton i tin, trn thc t ti cha bit h thng
tin t no khin cho cch lm ny sai. Tuy nhin trn l thuyt, c th ch ra nhng h
thng tin t m cch lm ny cho ra gii php khng ti u.
Gi s chng ta c 3 loi tin: 1 ng, 5 ng v 8 ng. Nu cn i 10 ng th phng n
ti u phi l dng 2 t 5 ng, nhng cch lm ny s cho phng n 1 t 8 ng v 2 t 1
ng. Hu qu ca php chn t tin 8 ng lm cho gii php cui cng khng ti u,
nhng d sao cng c th tm chp nhn c trn thc t.
Hu qu ca php chn tham lam tc thi s t hi hn nu chng ta ch c 2 loi tin: 5
ng v 8 ng. Khi thut ton ny s tht bi nu cn i 10 ng v khi rt t 8 ng ra
ri, khng c cch no i 2 ng na.

4.2. Thit k mt thut ton tham lam


Thc ra ch c mt kinh nghim duy nht khi tip cn bi ton v tm thut ton tham lam l
phi kho st k bi ton tm ra cc tnh cht c bit m ta c th a ra quyt nh
tc thi ti tng bc da vo s nh gi ti u cc b a phng.
Nhng v d di y nu ln mt vi phng php tip cn bi ton v thit k gii thut
tham lam ph bin.

4.3. Mt s v d v gii thut tham lam


Vi cc bi ton mang bn cht quy chng ta c th p dng quy trnh sau tm thut
ton tham lam (nu c):

Phn r bi ton ln ra thnh cc bi ton con ng dng m nghim ca cc bi ton


con c th dng ch ra nghim ca bi ton ln. Bc ny ging nh thut ton chia
tr v chng ta c th thit k s b mt m hnh chia tr.

Ch ra rng khng cn gii ton b cc bi ton con m ch cn gii mt bi ton con thi
l c th ch ra nghim ca bi ton ln. iu ny cc k quan trng, n ch ra rng s
la chn tham lam tc thi (ti u cc b) ti mi bc s dn n phng n ti u
tng th.

Phn tch dy quyt nh tham lam sa m hnh chia tr thnh mt gii thut lp.

4.3.1. Xp lch thc hin cc nhim v


Bi ton u tin chng ta kho st l bi ton xp lch thc hin cc nhim v (activity
selection), pht biu nh sau:
Chng ta c rt nhiu nhim v trong ngy. Gi s c

nhim v v nhim v th phi bt

u ngay sau thi im

, thc hin lin tc v kt thc ti thi im . C th coi mi


-. Hy chn ra nhiu nht cc
nhim v tng ng vi mt khong thi gian thc hin (
nhim v lm, sao cho khng c thi im no chng ta phi lm hai nhim v cng lc,
hay ni cch khc, khong thi gian thc hin hai nhim v bt k l khng giao nhau.
Input

Dng 1 cha s nguyn dng


dng tip theo, dng th cha hai s nguyn

Output
Phng n chn ra nhiu nhim v nht thc hin
Sample Input
5
7 9
6 8
1 3
0 6
3 7

Sample Output
Task 3: (1, 3]
Task 5: (3, 7]
Task 1: (7, 9]
Number of selected tasks: 3

0 1 2 3 4 5 6 7 8 9
5

1
2

Chia tr
V cc nhim v c chn ra phi thc hin tun t, chng ta s quan tm n nhim v
u tin. Nhim v u tin c th l bt k nhim v no trong s

nhim v cho.

Nhn xt rng chn nhim v th lm nhim v u tin th tt c nhng nhim v khc


mun lm s phi lm sau thi im . Bi ton tr thnh chn nhiu nhim v nht trong
s nhng nhim v c bt u sau thi im

(bi ton con).

Vy th chng ta c thut ton chia tr: Vi tp cc nhim v

+, th tt c

kh nng chn nhim v u tin. Vi mi php th ly nhim v lm nhim v u tin,


xc nh
nhim v

l tp cc nhim v bt u sau thi im


. Sau

v gii bi ton con vi tp cc

php th chn nhim v u tin, ta |nh gi|

k t qu tm c v

ly phng n thc hin c nhiu nhim v nht.


Php chn tham lam
Thut ton chia tr phn r bi ton ln thnh cc bi ton con da trn php chn nhim
v u tin lm, ta c mt quan st lm c s cho php chn tham lam:

nh l 4-1
Trong s cc phng n ti u, chc chn c mt phng n m nhim v u tin c
chn l nhim v kt thc sm nht.
Chng minh
Gi

l nhim v kt thc sm nht. Vi mt phng n ti u bt k, gi s th t cc


). Do l nhim v kt
nhim v cn thc hin trong phng n ti u l (
thc sm nht nn chc chn n khng th kt thc mun hn

, v vy vic thay

bi

trong phng n ny s khng gy ra s xung t no v thi gian thc hin cc nhim v.


S thay th ny cng khng lm gim bt s lng nhim v thc hin c trong phng
n ti u, nn (

) cng s l mt phng n ti u.

Yu cu ca bi ton l ch cn a ra mt phng n ti u, v th ta s ch ra phng n ti


u c nhim v u tin l nhim v kt thc sm nht trong s
ngha l chng ta khng cn th

nhim v. iu ny c

kh nng chn nhim v u tin, i gii cc bi ton con,

ri mi nh gi chng a ra quyt nh cui cng. Chng ta s a ngay ra quy t nh


tc thi: chn ngay nhim v kt thc sm nht
Sau khi chn nhim v

lm nhim v u tin.

, bi ton ln quy v bi ton con: Chn nhiu nhim v nht trong

s cc nhim v c bt u sau khi

kt thc. Php chn tham lam li cho ta mt quyt

nh tc thi: nhim v tip theo trong phng n ti u s l nhim v bt u sau thi


im , - v c thi im kt thc sm nht, gi l nhim v . V c nh vy chng ta
chn tip cc nhim v
Ci t gii thut tham lam
T tng ca gii thut tham lam c th tm tt li:
Chn

l nhim v kt thc sm nht

Chn

l nhim v kt thc sm nht bt u sau khi

kt thc: , -

, -

Chn

l nhim v kt thc sm nht bt u sau khi

kt thc: , -

, -

C nh vy cho ti khi khng cn nhim v no chn c na.


n y ta c th thit k mt gii thut lp:

Sp xp cc nhim v theo th t khng gim ca thi im kt thc , -

Khi to thi im

Duyt cc nhim v theo danh sch sp xp (nhim v kt thc sm s c xt


trc nhim v kt thc mun), nu xt n nhim v c , th chn
ngay nhim v

vo phng n ti u v cp nht
,thc nhim v :

thnh thi im kt

ACTIVITYSELECTION.PAS p lch thc hin cc nhim v

{$MODE OBJFPC}
program ActivitySelection;
const
max = 100000;
var
s, f: array[1..max] of Integer;
id: array[1..max] of Integer;
n: Integer;
procedure Enter; //Nhp d liu
var
i: Integer;
begin
ReadLn(n);
for i := 1 to n do
begin
ReadLn(s[i], f[i]);
id[i] := i;
end;
end;
//QuickSort: Sp x p b ng ch s cc cng vic id L id H tng theo thi im k t thc
procedure QuickSort(L, H: Integer); f id L f id L
f id H

var
i, j: Integer;
pivot: Integer;
begin
if L >= H then Exit;
i := L + Random(H - L + 1);
pivot := id[i]; id[i] := id[L];
i := L; j := H;
repeat
while (f[id[j]] > f[pivot]) and (i < j) do Dec(j);
if i < j then
begin
id[i] := id[j]; Inc(i);
end
else Break;
while (f[id[i]] > f[pivot]) and (i < j) do Inc(i);
if i < j then
begin
id[j] := id[i]; Dec(j);
end
else Break;
until i = j;
id[i] := pivot;
QuickSort(L, i - 1); QuickSort(i + 1, H);
end;
procedure GreedySelection; //Thut ton tham lam
var
i, nTasks: Integer;
FinishTime: Integer;
begin
FinishTime := 0;

nTasks := 0;
for i := 1 to n do //Xt ln l t cc nhim v id[i] theo thi im k t th c tng dn
if s[id[i]] >= FinishTime then //N u g p nhim v bt u sau FinishTime
begin
WriteLn('Task ', id[i], ': (', s[id[i]], ', ', f[id[i]], ']'); //Chn tc th
Inc(nTasks);
FinishTime := f[id[i]]; //Cp nht l i thi im k t thc mi FinishTime
end;
WriteLn('Number of selected tasks: ', nTasks);
end;
begin
Enter;
QuickSort(1, n);
GreedySelection;
end.

D thy rng thut ton chn tham lam th tc


c thc hin trong
thi gian ( ). Thi gian mt ch yu nm thut ton sp xp cc cng vic theo thi im
kt thc. Nh v d ny chng ta dng QuickSort: trung bnh (

).

4.3.2. Ph
Trn trc s cho

on: ,

on cho ph ht on ,

-,

-. Hy chn mt s t nht trong s

-.

Input

Dng 1 cha ba s nguyn

)
(

dng tip theo, dng th cha hai s nguyn

Output
Cch chn ra t nht cc on ph on ,

Sample Input
7 1 9
6 10
4 8
0 3
1 3
2 4
2 7
5 9

Sample Output
Selected Intervals:
Interval 3: [0, 3]
Interval 6: [2, 7]
Interval 1: [6, 10]

10

1
2
3
4
5
6
7

Chia tr
Trc ht ta s tm thut ton trong trng hp d liu vo m bo tn ti phng n ph
-. Sau , vic kim tra s tn ti ca li gii s c tch hp vo khi ci t thut
on ,
ton.

- chc chn phi chn mt on ,


- no ph
Phng n ti u ph ht on ,
- cha im c chn vo phng n ti u, khi nu on
im . Gi s on ,
ny ph ti c im , ta c li gii, cn nu khng, bi ton tr thnh ph on ,

- bng

t on nht trong s cc on cn li.


Ta phn r mt bi ton thnh nhiu bi ton con tng ng vi mi cch chn on ,

ph im , gii cc bi ton con ny v chn phng n tt nht trong tt c cc phng


n.
Php chn tham lam
thun tin trong vic trnh by thut ton, vi mt on ,
(lower bound) v

-, ta gi

l cn di

l cn trn (upper bound) ca on .

Thut ton chia tr da vo s la chn on ph im , ta c mt nhn xt lm c s


cho php chn tham lam:
nh l 4-2
Trong phng n ti u s ch c mt on ph im . Hn na, nu c nhiu phng n
cng ti u, on c cn trn ln nht ph im

chc chn c chn vo mt phng n

ti u no .
Chng minh
Tht vy, nu c phng n cha hai on ph im th nu ta b i on c cn trn nh
- vn c ph, nn phng n ny khng ti u.
hn, on ,
Mt khc, gi [

] l on c cn trn

ln nht ph im . Vi mt phng n ti

u bt k, gi s rng phng n chn on [


on [

] v [

] ph im , theo gi thit, c hai

] u ph im , nhng on [

nhiu hn on [

] s ph v bn phi im

]. iu ny ch ra rng nu thay th on [

ta vn ph c c on ,

] bi on [

- v khng lm nh hng ti s on c chn trong

phng n ti u. Suy ra iu phi chng minh.


Vy th thay v th tt c cc kh nng chn on ph im , ta c th a ra quyt nh tc
th: Chn ngay on [

] c cn trn ln nht ph c im

vo phng n ti u.

Ci t gii thut tham lam


Gii thut cho bi ton ny c th tm tt nh sau:
Chn on [

] c

ln nht tha mn

]. Nu on ny ph ht on ,

th xong. Nu khng, ta li chn tip on [


mi

ln nht v ph c im

, v c tip tc nh vy, ta c phng n ti u:


[

Nhn xt:

] c

] [

] [

-:

Cc on c chn vo phng n ti u c cn trn tng dn:

iu ny c th d hnh dung c qua cch chn: Mi khi chn mt on mi, on


ny s phi ph qua cn trn ca on trc .

Cc on c chn vo phng n ti u c cn di tng dn:

Tht vy, nu cn di ca cc on c chn khng tng dn th trong s cc on


c chn s c hai on cha nhau, suy ra phng n ny khng phi phng n ti
u.
n y ta c th thit k mt gii thut lp:
Sp xp danh sch cc on cho theo th t khng gim ca cn di. t ch s u
danh sch

Bc 1: Xt phn danh sch bt u t v tr gm cc on c cn di


phn ny chn ra on c cn trn

Bc 2: Nu

. Tm trong

ln nht vo phng n ti u.

, thut ton kt thc. Nu khng, t

, cp

nht thnh ch s ng sau on va xt v lp li t bc 1.


(Sau bc 2, chng ta c th thoi mi b qua phn u danh sch gm nhng on ng
trc v tr , bi tt c nhng on nm trong phn ny u c cn trn
nh nhn xt, on tip theo cn chn chc chn phi c cn trn

INTERVALCOVER.PAS Ph

{$MODE OBJFPC}
program IntervalCover;
const
maxN = 100000;
var
a, b: array[1..maxN] of Integer;
id: array[1..maxN] of Integer;
p, q: Integer;
n: Integer;
NoSolution: Boolean;
procedure Enter; //Nhp d liu
var
i: Integer;
begin
ReadLn(n, p, q);
for i := 1 to n do
begin
ReadLn(a[i], b[i]);
id[i] := i;
end;
end;
//Sp x p cc b ng ch s, th t khng gim theo gi tr cn d i a id L a id L

procedure QuickSort(L, H: Integer);


var
i, j: Integer;
pivot: Integer;

a id H

m
)

begin
if L >= H then Exit;
i := L + Random(H - L + 1);
pivot := id[i]; id[i] := id[L];
i := L; j := H;
repeat
while (a[id[j]] > a[pivot]) and (i < j) do Dec(j);
if i < j then
begin
id[i] := id[j]; Inc(i);
end
else Break;
while (a[id[i]] < a[pivot]) and (i < j) do Inc(i);
if i < j then
begin
id[j] := id[i]; Dec(j);
end
else Break;
until i = j;
id[i] := pivot;
QuickSort(L, i - 1); QuickSort(i + 1, H);
end;
//Php chn tham lam

procedure GreedySelection;
var
i, j: Integer;
RightMost, k: Integer;
begin
i := 1;
RightMost := -1;
anh s|ch c|c o n theo th t khng gim ca cn d i: id[1], id[2], ..., id[n]

repeat

//Duyt bt u t id i , xt c|c o n c cn d i <=p, chn ra o n id[j] c cn trn RightMost ln nht

j := 0;
while (i <= n) and (a[id[i]] <= p) do
begin
if RightMost < b[id[i]] then
begin
RightMost := b[id[i]];
j := i;
end;
Inc(i);
end;
if j = 0 then //n u khng chn c, bi ton v nghim
begin
NoSolution := True;
Exit;
end;
id[j] := -id[j];
|nh du, o n id[j] c chn v{o ph ng |n ti u
p := RightMost; //Cp nht l i p, n u ch a ph n q, tm ti p trong danh sch (khng tm l i t u)
until p >= q;
NoSolution := False;
end;
procedure PrintResult; //In k t qu
var

i, j: Integer;
begin
if NoSolution then
WriteLn('No Solution!')
else
begin
WriteLn('Selected Intervals: ');
for i := 1 to n do
begin
j := -id[i];
if j > 0 then In ra c|c o n c |nh du
WriteLn('Interval ', j, ': [', a[j], ', ', b[j], ']');
end;
end;
end;
begin
Enter;
QuickSort(1, n);
GreedySelection;
PrintResult;
end.

D thy rng thi gian thc hin gii thut chn tham lam trong th tc
l
( ), chi ph thi gian ca thut ton ch yu nm giai on sp xp. Trong chng trnh
ny chng ta dng QuickSort: Trung bnh (

).

4.3.3. M ha Huffman
M ha Huffman [11] c s dng rng ri trong cc k thut nn d liu. Trong a s cc
th nghim, thut ton m Huffman c th nn d liu xung cn t 10% ti 80% ty thuc
vo tnh trng d liu gc.
C ch nn d liu
t bi ton lu tr mt dy d liu gm

k t. Thut ton Huffman da vo tn sut xut

hin ca mi phn t xy dng c ch biu din mi k t bng mt dy bit.


Gi s d liu l mt xu 100 k t

+. Tn sut (s ln) xut hin ca mi k

t cho bi:
K t:
A B
C D E F
Tn sut: ( ) 45 13 12 16 9 5
Mt cch thng thng l biu din mi k t bi mt dy bit chiu di c nh (nh bng
m ASCII s dng 8 bit cho mt k t AnsiChar hay bng m Unicode s dng 16 bit cho mt
k t WideChar). Chng ta c 6 k t nn c th biu din mi k t bng mt dy 3 bit:

K t
A
B
C
D
E
F
M bit 000 001 010 011 100 101
V mi k t chim 3 bit nn biu din xu k t cho s cn

. Cch

biu din ny gi l biu din bng t m chiu di c nh (fixed-length codewords).


Mt cch khc l biu din mi k t bi mt dy bit sao cho k t xut hin nhiu ln s
c biu din bng dy bt ngn trong khi k t xut hin t ln hn s c biu din
bng dy bit di:
K t A
B
C
D
E
F
M bit 0 101 100 111 1101 1100
Vi cch lm ny, xu k t cho c th biu din bng:
D liu c nn xung cn xp x 75%. Cch biu din ny c gi l biu din bng t
m chiu di thay i (variable-length codewords).
M phi tin t
Dy bt biu din mt k t gi l t m (codeword) ca k t . t tp cc t m ca cc
k t, nu khng tn ti mt t m l tin t* ca mt t m khc th tp t m ny c gi
l m phi tin t (prefix-free codes hay cn gi l prefix codes). Hin nhin cch biu din
bng t m chiu di c nh l m phi tin t.
Mt m phi tin t c th biu din bng mt cy nh phn. Trong ta gi nhnh con tri v
nhnh con phi ca mt nt ln lt l l nhnh 0 v nhnh 1. Cc nt l tng ng vi cc
k t v ng i t nt gc ti nt l s tng ng vi mt dy nh phn biu din k t
. Hnh 4-1 l hai cy nh phn tng ng vi hai m tin t chiu di c nh v chiu di
thay i nh v d trn.

Mt xu k t

c gi l tin t ca xu k t

nu

0
0

000

001

010

011

100

101

100

101

1
111

1100

1101

Hnh 4-1. Cy biu din m tin t

Mt xu k t

(bn gc) s c m ha (nn) theo cch thc: Vit cc t m ca tng ch

ci ni tip nhau to thnh mt dy bit. Dy bit ny gi l bn nn ca bn gc . Trong v d


ny xu AABE s c nn thnh dy bit 001011101 nu s dng m tin t chiu di
thay i nh cy bn phi Hnh 4-1.
Tnh cht phi tin t m bo rng vi mt t m, nu xut pht t gc cy, c t m t
tri qua phi v mi khi c mt bit ta r sang nhnh con tng ng th khi c xong t m,
ta s ng mt nt l. Chnh v vy vic gii m (gii nn) s c thc hin theo thut
ton: Bt u t nt gc v c bn nn, c c bit no r sang nhnh con tng ng. Mi
khi n c nt l, ta xut ra k t tng ng v quay tr v nt gc c tip cho ti
ht.
Nu k hiu

l tp cc k t, mi k t

c biu din bng t m gm

( ) bit th

s bit trong bn nn l:
( )

( ) ( )

Trong ( ) l s ln xut hin k t trong xu k t gc v


l tng ng vi k t . ( ) gi l chi ph ca cy .

(4.1)
( ) cng l su ca nt

Kch thc bn nn ph thuc vo cu trc cy nh phn tng ng vi m phi tin t c


s dng. Bi ton t ra l tm m phi tin t nn bn gc thnh bn nn gm t bit nht.
iu ny tng ng vi vic tm cy c ( ) nh nht tng ng vi mt bn gc l
xu k t u vo .
Thut ton Huffman
Gi s cc nt trn cy nh phn cha bn trong cc thng tin:

K t tng ng vi nt nu l nt l ( )

Tn sut ca nt ( ). Tn sut ca mt nt l s ln duyt qua nt khi gii nn. D


thy rng tn sut nt l chnh l tn sut ca k t tng ng trong bn gc v tn
sut ca mt nt nhnh bng tng tn sut ca hai nt con.

Hai lin kt tri, phi ( v )

t danh sch ban u gm tt c cc nt l ca cy. Thut ton Huffman lm vic theo cch:
Ly t danh sch ra hai nt
hai nt

c tn sut thp nht. To ra mt nt

v , tn sut ca nt c gn bng tng tn sut hai nt

lm nt cha ca c
, sau c y

vo danh sch (ra hai vo mt). Thut ton s kt thc khi danh sch ch cn mt nt (tng
ng vi nt gc ca cy c xy dng). C th hnh dung ti mi bc, thut ton qun l
mt rng cc cy v tm cch nhp hai cy li cho ti khi rng ch cn mt cy.
Danh sch cc nt trong thut ton Huffman c t chc di dng hng i u tin.
Trong nt

c gi l u tin hn nt

nu tn sut nt

nh hn tn sut nt :

Hai thao tc trn hng i u tin c s dng l:

Hm

Ly nt c tn sut nh nht ra khi hng i u tin, tr v trong kt

qu hm

Th tc

( ): Thm mt nt mi ( ) vo hng i u tin

Khi c th vit c th hn thut ton Huffman:


H := ; //Kh i t o h{ng i u ti n H
for cC do
begin
To ra mt nt mi node c tn sut f(c) v cha k t c;
Insert(node);
end;
while |H|> 1 do
begin
x := Extract; y := Extract; //Ly t h{ng i u ti n ra hai n t c tn sut nh nht
To ra mt nt mi z;
z.f := x.f + y.f; //z c tn sut b ng tng tn sut hai nt x, y
z.l := x; z.r := y; //cho x v y lm con tri v con phi ca z
Insert(z);
y z v{o h{ng i u ti n
end;

Php la chn tham lam trong thut ton Huffman th hin s quyt nh tc th ti mi
bc: Chn hai cy c tn sut nh nht nhp vo thnh mt cy. Tnh ng n ca
thut ton Huffman c chng minh nh sau:
B 4-3
Cy tng ng vi m phi tin t ti u phi l cy nh phn y . Tc l mi nt nhnh
ca n phi c ng hai nt con.

Chng minh
Tht vy, nu mt m tin t tng ng vi cy nh phn
nt nhnh

ch c mt nt con . Xa b nt nhnh

th ch, ta c mt cy mi
nhnh cy gc

khng y th s tn ti mt

v a nhnh con gc

ca n vo

m cc k t vn ch nm l, su ca mi l trong

gim i 1 cn su ca cc l khc c gi nguyn. Tc l

mt m phi tin t nhng vi chi ph thp hn . Vy

s biu din

khng ti u.

B 4-4
Gi
cha

l hai k t c tn sut nh nht. Khi tn ti mt cy ti u sao cho hai nt l

l con ca cng mt nt. Hay ni cch khc, hai nt l

l anh-em (siblings).

Chng minh
Tn sut ca nt l bng tn sut ca k t cha trong nn s bt bin trn mi cy. tin
trnh by ta ng nht nt l vi k t cha trong n.
Vi

l mt cy ti u bt k, ly mt nt nhnh su nht v gi

D thy rng
( )
( ).
o nt

l hai nt con ca n.
( ) v
phi l nt l. Khng gim tnh tng qut, gi s rng ( )

v nt

cho nhau, ta c mt cy mi

ch khc nhau hai nt


( )

( )

, ( )
( ( )

( )
( )

( )
( )

( ))(

( )( )

( )

iu ny ch ra rng nu o hai nt

( )

( )

( )

( )

( )

( )

, ng thi

v , ta s c cy

Tng t nh vy, nu ta o tip hai nt


ti u, suy ra

, ( )

( )-

( )

(4.2)

( ))

(Bi l nt c tn sut thp nht nn ( )


( )
( )
)

. T cy

m s khc bit v chi ph ca

v . Tc l nu xt v mc chnh lch chi ph:

( )

t hn cy

trn cy

ti u, v trn

l nt l su nht nn

t ra l khng t hn cy .

, ta s c cy
th

t ra l khng

l hai nt con ca cng

mt nt (PCM).
nh l 4-5
Gi

l tp cc k t trong xu k t u vo

l tp cc k t c c t
*
+ * + vi tn sut ( )

Ta c

l hai k t c tn sut thp nht. Gi

bng cch thay hai k t


bi mt k t :
( )
( ). Gi l cy ti u trn , khi nu cho nt

l tr thnh nt nhnh vi hai nt con


Chng minh

, ta s c cy

l cy ti u trn .

( )

( )

( )

( )

( ( )
( )

T suy ra ( )

( )

Gi s phn chng rng

( )

vi tn sut ( )

( ( )

( ) hay ( )

( )

(4.3)

( ))
( )

( ).

l anh-em (B 4-4). a k t vo nt cha chung ca


( ) ri ct b hai nt l
trn . Ta s c cy mi

( )

tng ng vi mt m phi tin t trn


( )

( )

( )

khng ti u, gi l cy ti u trn tp k t . Xt cy , khng

gim tnh tng qut, c th coi


v

( ))(

. Trong :

( )

( )

( )

( )

( )

( ) (do T khong toi u)

(4.4)

( )
Vy

( )

( ), mu thun vi gi thit

l ti u trn tp k t

. Ta c iu phi

chng minh.
Tnh ng n ca thut ton Huffman c suy ra trc tip t nh l 4-5: tm cy ti
u trn tp k t , ta tm hai k t c tn sut thp nht
k t . Sau khi thit lp quan h cha-con gia v
*
+ * + c lc lng t hn
u trn tp

v nhp chng li thnh mt

, ta quy v bi ton con: Tm cy ti


mt phn t.

Ci t
Chng ta s ci t chng trnh tm m phi tin t ti u m ha cc k t trong mt xu
k t u vo .
Input
Xu k t
Output
Cc t m tng ng vi cc k t.

Sample Input
abcdefabcdefabcdeabcdabdadaaaaaaaa

Sample Output
0 = a
100 = c
101 = b
1100 = f
1101 = e
111 = d

30
0

14

20
1

a
9
0

11
1

0
5
0

6
1

Hng i u tin ca cc nt trong chng trnh c t chc di dng Binary Heap (Mc
( ) vun
Error! Reference source not found.). Trn ta ci t mt thao tc
nhnh Heap gc thnh ng trong iu kin hai nhnh con ca n (gc

) l

ng ri. Ti mi bc ca thut ton Huffman, thay v ci t c ch ra hai vo mt, ta s


s dng mt mo nh: Ly khi Heap (
l cha chung ca
( ).

v , a nt

) mt nt , c nt

vo gc Heap ln nt

gc Heap (

ri thc hin vun ng t gc:

HUFFMAN.PAS M ha Huffman

{$MODE OBJFPC}
program HuffmanCode;
const
MaxLeaves = 256; //Cc k t l kiu AnsiChar, cn i kch th c n u dng kiu d liu khc
type
TNode = record //Cu trc nt trn cy Huffman
f: Integer;
c: AnsiChar;
l, r: Pointer;
end;
PNode = ^TNode; //Kiu con tr ti nt
THeap = record //Cu trc d liu Binary Heap
items: array[1..MaxLeaves] of PNode;
nItems: Integer;
end;
var
s: AnsiString; //Xu k t u vo
Heap: THeap; H{ng i u ti n
TreeRoot: PNode; //Gc cy Huffman
bits: array[1..MaxLeaves] of Integer;
//T o ra mt nt mi cha tn sut fq, k t ch, v hai nhnh con left, right

), to nt

function NewNode(fq: Integer; ch: AnsiChar; left, right: PNode): PNode;


begin
New(Result);

with Result^ do
begin
f:= fq;
c := ch;
l := left;
r := right;
end;
end;
nh ngha quan h u ti n hn l{ quan h < n t x u ti n hn n t y n u tn sut ca x nh hn

operator < (const x, y: TNode): Boolean;


begin
Result := x.f < y.f;
end;
//Vun nhnh Heap gc r th{nh ng

procedure Heapify(r: Integer);


var
c: Integer;
temp: PNode;
begin
with Heap do
begin
temp := items[r];
repeat
c := r * 2;
if (c < nItems) and (items[c + 1]^ < items[c]^) then
Inc(c);
if (c > nItems) or not (items[c]^ < temp^) then Break;
items[r] := items[c];
r := c;
until False;
items[r] := temp;
end;
end;
c nt gc Heap

function Get: PNode;


begin
with Heap do Result := items[1];
end;
//Ly nt c tn sut nh nht ra khi Heap

function Pop: PNode;


begin
with Heap do
begin
Result := items[1];
items[1] := items[nItems];
Dec(nItems);
Heapify(1);
end;
end;
//Thay nt gc Heap b i node

procedure UpdateRootHeap(node: PNode);


begin

with Heap do
begin
items[1] := node;
Heapify(1);
end;
end;
procedure InitHeap; //Kh i t o Heap ban u cha cc nt l
var
c: AnsiChar;
i: Integer;
freq: array[AnsiChar] of Integer;
begin
FillByte(freq, Length(freq), 0);
for i := 1 to Length(s) do Inc(freq[s[i]]);
m tn sut
with Heap do
begin
nItems := 0;
for c := Low(AnsiChar) to High(AnsiChar) do
if freq[c] > 0 then //Xt cc k t trong S
begin
Inc(nItems);
items[nItems] := NewNode(freq[c], c, nil, nil); //T o nt cha k t
end;
for i := nItems div 2 downto 1 do Vun ng t d i ln
Heapify(i);
end;
end;
procedure BuildTree; //Thut ton Huffman
var
x, y, z: PNode;
begin
while Heap.nItems > 1 do //Chng no Heap cn nhiu hn phn t
begin
x := Pop; //Ly nt tn sut nh nht khi Heap
y := Get;
c nt tn sut nh nht ti p theo gc Heap
z := NewNode(x^.f + y^.f, #0, x, y); //T o nt z l cha ca x v y
UpdateRootHeap(z);
a z v{o gc Heap v thc hin vun ng: Ra x v y, vo z
end;
TreeRoot := Heap.items[1]; //Gi l i gc cy Huffman
end;
//Th tc ny in ra cc t m ca cc l trong cy Huffman gc node, depth l{ su ca node
procedure Traversal(node: PNode; depth: Integer); //Duyt cy Huffman gc node

var
i: Integer;
begin
if node^.l = nil then //N u node l nt l
begin //In ra dy bit biu din k t
for i := 1 to depth do Write(bits[i]);
WriteLn(' = ', node^.c);
Dispose(node);
end
else //N u node l nt nhnh
begin

bits[depth + 1] :=
Traversal(node^.l,
bits[depth + 1] :=
Traversal(node^.r,
end;
end;

0; //Cc t m ca cc l trong nhnh con tri s c bit ti p theo l 0


depth + 1); //Duyt nhnh tri
1; //Cc t m ca cc l trong nhnh con phi s c bit ti p theo l 1
depth + 1); //Duyt nhnh phi

begin
ReadLn(s);
InitHeap;
BuildTree;
Traversal(TreeRoot, 0);
end.

Xt ring thut ton Huffman th tc BuildTree. Ta thy rng nu

l s k t (s nt l

trong cy Huffman) th vng lp while s lp


ln. Cc li gi th tc bn trong vng lp
). Vy thut ton Huffman c thi gian thc hin (
).
c thi gian thc hin (
Chng ta kho st vi bi ton m , thut ton tham lam c thit k da trn mt
m hnh chia tr.
Thut ton tham lam cn a ra quyt nh tc th ti mi bc la chn. Quyt nh ny s
nh hng ngay ti s la chn bc k tip. Chnh v vy, i khi phn tch k hai quyt
nh lin tip c th cho ta nhng tnh cht ca nghim ti u v t c th xy dng mt
thut ton hiu qu.

4.3.4. Lch x l li
Bn l mt ngi qun tr mt h thng thng tin, v trong h thng cng lc ang xy ra
li nh s t 1 ti . Li s gy ra thit hi

sau mi ngy v khc phc li cn

ngy. Ti mt thi im, bn ch c th x l mt li. Hy ln lch trnh x l li sao cho tng


thit hi ca

li l nh nht c th.

Input

Dng 1 cha s nguyn dng


dng tip theo, mi dng cha hai s nguyn dng

Output
Lch x l li

Sample Input
4
1 3
3 2
4 3
2 1

Sample Output
Bug 4: fixed time =
Bug 2: fixed time =
Bug 3: fixed time =
Bug 1: fixed time =
Minimum Damage = 44

1;
3;
6;
9;

damage
damage
damage
damage

=
=
=
=

2
9
24
9

1
4

2
2

5
3

8
1

Do mi li ch ngng gy thit hi khi n c khc phc, nn d thy rng lch trnh cn tm


s phi c tnh cht: Khi bt tay vo x l mt li, ta s phi lm lin tc cho ti khi li
) tng ng vi th t
c khc phc. Tc l ta cn tm mt hon v ca dy s (
trong lch trnh khc phc cc li.
(

Gi s rng lch trnh

) x l ln lt cc li t 1 ti
(

u. Ta ly mt lch trnh khc


hai li lin tip: v

) c c bng cch o th t x l

trn lch trnh

Ta nhn xt rng ngoi hai li v

, thi im cc li khc c khc phc l ging nhau

trn hai lch trnh, c ngha l s khc bit v tng thit hi ca lch trnh
ch nm thit hi do hai li v
Gi

l thi im li
(

Nu theo lch trnh

gy ra l:

(4.5)

), thit hi ca hai li v
(

Thit hi theo lch trnh

v ). Khi :

), thit hi ca hai li v
(

v lch trnh

gy ra.

c khc phc (trn c hai lch trnh

Nu theo lch trnh

thit hi

l lch trnh ti

gy ra l:

(4.6)

khng th ln hn thit hi theo lch trnh

(do

ti u), tc l

s khng ln hn thit hi . Loi b nhng hng t ging nhau cng thc tnh

v , ta c:
(4.7)
(

Vy th nu lch trnh

Ngoi ra c th thy rng nu

) l ti u, n s phi tha mn:

th

, hai lch trnh sa cha

thit hi. Trong trng hp ny, vic sa li trc hay

c cng mc

trc u cho cc phng n

cng ti u. T suy ra phng n ti u cn tm l phng n khc phc cc li theo th


t tng dn ca t s

()
()

. Li gii lp n thun ch l mt thut ton sp xp.

BUGFIXSCHEDULING.PAS Lch x l li

{$MODE OBJFPC}
program BugFixes;
const
max = 100000;
type
TBug = record
d, t: Integer;

end;
var
bugs: array[1..max] of TBug;
id: array[1..max] of Integer;
n: Integer;
procedure Enter; //Nhp d liu
var
i: Integer;
begin
ReadLn(n);
for i := 1 to n do
with bugs[i] do
begin
ReadLn(d, t);
id[i] := i;
end;
end;
nh ngha l i ton t < trn cc li. Li x gi l{ nh hn li y n u x.t/x.d < y.t/y.d

operator < (const x, y: TBug): Boolean;


begin
Result := x.t * y.d < y.t * x.d;
end;

//Sp x p cc li bugs[L...H] theo quan h th t nh hn nh ngha trn

procedure QuickSort(L, H: Integer);


var
i, j: Integer;
pivot: Integer;
begin
if L >= H then Exit;
i := L + Random(H - L + 1);
pivot := id[i]; id[i] := id[L];
i := L; j := H;
repeat
while (bugs[pivot] < bugs[id[j]]) and (i < j) do Dec(j);
if i < j then
begin
id[i] := id[j]; Inc(i);
end
else Break;
while (bugs[id[i]] < bugs[pivot]) and (i < j) do Inc(i);
if i < j then
begin
id[j] := id[i]; Dec(j);
end
else Break;
until i = j;
id[i] := pivot;
QuickSort(L, i - 1); QuickSort(i + 1, H);
end;
procedure PrintResult; //In k t qu
var
i: Integer;
Time, Damage: Integer;

TotalDamage: Int64;
begin
Time := 0;
TotalDamage := 0;
for i := 1 to n do
with bugs[id[i]] do
begin
Time := Time + t;
Damage := Time * d;
WriteLn('Bug ', id[i], ': fixed time = ', Time, '; damage = ', Damage);
Inc(TotalDamage, Damage);
end;
WriteLn('Minimum Damage = ', TotalDamage);
end;
begin
Enter;
QuickSort(1, n);
PrintResult;
end.

4.3.5. Thut ton Johnson


Bi ton
Bi ton lp lch gia cng trn hai my (Two-machine flow shop model): C
t 1 ti

v hai my

. Mt chi tit cn gia cng trn my

cng trn my . Thi gian gia cng chi tit trn my

chi tit nh s

trc ri chuyn sang gia

ln lt l

. Ti mt

thi im, mi my ch c th gia cng mt chi tit. Hy lp lch gia cng cc chi tit sao cho
vic gia cng ton b

chi tit c hon thnh trong thi gian sm nht.

Input

Dng 1 cha s nguyn dng

Dng 2 cha

s nguyn dng

Dng 3 cha

s nguyn dng

Output
Lch gia cng ti u

Sample Input
4
3 1 2 4
4 2 1 3

Sample
Job 2:
Job 1:
Job 4:
Job 3:
Time =

Output
A[0, 1]; B[1, 3]
A[1, 4]; B[4, 8]
A[4, 8]; B[8, 11]
A[8, 10]; B[11, 12]
12

0 1 2 3 4 5 6 7 8 9 10 11 12
2

1
2

4
1

3
4

Thut ton
Nhn xt rng lun tn ti mt lch gia cng ti u sao m cc chi tit gia cng trn my
theo th t nh th no th s c gia cng trn my
hot ng lin tc khng ngh cn my

theo th t ng nh vy. My

c th c nhng khong thi gian cht khi ch chi

tit t my . Nh vy ta cn tm mt lch gia cng ti u di dng mt hon v ca dy s


(
).
nh l 4-6 (nh l Johnson)
Mt lch gia cng ti u cn tha mn tnh cht: Nu chi tit c gia cng trc chi tit
th

cng chi tit

(
v chi tit

). Hn na nu

) th vic o th t gia

trong phng n ti u vn s duy tr c tnh ti u ca

phng n.
nh l 4-7
Xt quan h hai ngi nh hn hoc bng (k hiu ) xc nh trn tp cc chi tit. Quan h
ny nh ngha nh sau:

nu:

Hoc

Hoc

) v

Khi quan h

l mt quan h th t ton phn (c y cc tnh cht: ph bin, phn

x, phn i xng, v bc cu)


Vic chng minh c th hai nh l trn kh di dng, cc bn c th tham kho trong cc ti
liu khc.
Ci t
nh l 4-6 (nh l Johnson) v nh l 4-7 ch ra rng thut ton Johnson c th ci t
bng mt thut ton sp xp so snh. Tuy nhin khi ci t thut ton sp xp so snh,
chng ta ch cn ci t php ton
tit

bng vit kim tra bt ng thc


(

: cho bit chi tit bt buc phi gia cng trc chi
(

), gia cng chi tit trc hay trc u c


JOHNSONALG.PAS Thut ton Johnson

{$MODE OBJFPC}
program JohnsonAlgorithm;
uses Math;
const
maxN = 100000;
type
TJob = record
a, b: Integer;
end;
var
jobs: array[1..maxN] of TJob;
id: array[1..maxN] of Integer;

). Bi khi

n: Integer;
procedure Enter; //Nhp d liu
var
i: Integer;
begin
ReadLn(n);
for i := 1 to n do Read(jobs[i].a);
ReadLn;
for i := 1 to n do Read(jobs[i].b);
for i := 1 to n do id[i] := i;
end;
nh ngha to|n t "phi l{m tr c": <. Chi ti t x phi l{m tr c chi ti t y n u Min(x.a, y.b) < Min(y.a, x.b)

operator < (const x, y: TJob): Boolean; //Ton t ny dng cho sp x p


begin
Result := Min(x.a, y.b) < Min(y.a, x.b);
end;
//Thut ton QuickSort sp x p b ng ch s

procedure QuickSort(L, H: Integer);


var
i, j: Integer;
pivot: Integer;
begin
if L >= H then Exit;
i := L + Random(H - L + 1);
pivot := id[i]; id[i] := id[L];
i := L; j := H;
repeat
while (jobs[pivot] < jobs[id[j]]) and (i < j) do Dec(j);
if i < j then
begin
id[i] := id[j]; Inc(i);
end
else Break;
while (jobs[id[i]] < jobs[pivot]) and (i < j) do Inc(i);
if i < j then
begin
id[j] := id[i]; Dec(j);
end;
else Break;
until i = j;
id[i] := pivot;
QuickSort(L, i - 1); QuickSort(i + 1, H);
end;
procedure PrintResult; //In k t qu
var
StartA, StartB, FinishA, FinishB: Integer;
i, j: Integer;
begin
StartA := 0;
StartB := 0;
for i := 1 to n do //Duyt danh s|ch ~ sp x p
begin
j := id[i];

FinishA := StartA + jobs[j].a;


StartB := Max(StartB, FinishA);
FinishB := StartB + jobs[j].b;
WriteLn('Job ', j, ': ',
'A[', StartA, ', ', FinishA, ']; B[', StartB, ', ', FinishB, ']');
StartA := FinishA;
StartB := FinishB;
end;
WriteLn('Time = ', FinishB);
end;
begin
Enter;
QuickSort(1, n);
PrintResult;
end.

Thi gian thc hin thut ton Johnson ci t theo cch ny c th nh gi bng thi gian
)). C th ci t
thc hin gii thut sp xp. y ta dng QuickSort (Trung bnh (
thut ton Johnson theo mt cch khc tn dng cc thut ton sp xp dy kha s, cch
lm nh sau:
Chia cc chi tit lm hai nhm: Nhm
chi tit c

gm cc chi tit c

. Sp xp cc chi tit trong nhm

xp cc chi tit trong nhm

v nhm

gm cc

theo th t tng dn ca cc

theo th t gim dn ca cc

, sp

ri ni hai danh sch sp

xp li.
Bi tp 4-1.
Bn l ngi lp lch ging dy cho
im

chuyn , chuyn th cn bt u ngay sau thi


-. Mi chuyn trong thi gian din gia hot ng
v kt thc ti thi im : (

ging dy s cn mt phng hc ring. Hy xp lch ging dy sao cho s phng hc phi s


).
dng l t nht. Tm thut ton (
Bi tp 4-2.
Trn trc s cho

im en v

im trng hon ton phn bit. Hy tm

on, mi on

ni mt im en vi mt im trng, sao cho khng c hai on thng no c chung u


).
mt v tng di on l nh nht c th. Tm thut ton (
Bi tp 4-3.
Xt m phi tin t ca mt tp

k t. Nu cc k t c sp xp sn theo th t khng
gim ca tun sut th chng ta c th xy dng cy Huffman trong thi gian ( ) bng cch
s dng hai hng i: To ra cc nt l cha k t v y chng vo hng i 1 theo th t
t nt tn sut thp nht ti nt tn sut cao nht. Khi to hng i 2 rng, lp li cc thao
tc sau

ln:

Ly hai nt

c tn sut thp nht ra khi cc hng i bng cch nh gi cc phn

t u ca c hai hng i

To ra mt nt lm nt cha ca hai nt

y vo cui hng i 2

vi tn sut bng tng tn sut ca

Chng minh tnh ng n v ci t thut ton trn.


Bi tp 4-4.
Bi ton xp ba l (Knapsack) chng ta kho st trong chuyn k thut nhnh cn v
quy hoch ng l bi ton 0/1 Knapsack: Vi mt sn phm ch c hai trng thi: chn hay
khng chn. Chng ta cng kho st bi ton Fractional Knapsack: Cho php chn mt
phn sn phm: Vi mt sn phm trng lng
lng

v gi tr , nu ta ly mt phn trng

ca sn phm th s c gi tr l

. Ch ra rng hm

trong

mc 1.4.3 cho kt qu ti u i vi bi ton Fractional Knapsack.


Bi tp 4-5.
Gio s

li xe trong mt chuyn hnh trnh uyn Vit t Cao Bng ti C Mau di km.

Dc trn ng i c

trm xng v trm xng th cch Cao Bng

khi y c th i c

km. Bnh xng ca xe

km. Hy xc nh cc im dng xng ti cc trm xng

sao cho s ln phi dng xng l t nht trong c hnh trnh.


Bi tp 4-6.
Cho

. Hy ch ra t nht cc on dng ,

im thc trn trc s:

l s nguyn ph ht

- vi

im cho.

Bi tp 4-7.
Bn c

nhim v, mi nhim v cn lm trong mt n v thi gian. Nhim v th c thi

im phi hon thnh (deadline) l


th s phi mt mt khon pht

v nu bn hon thnh nhim v sau thi hn

. Bn bt u t thi im 0 v ti mi thi im ch c th

thc hin mt nhim v. Hy ln lch thc hin cc nhim v sao cho tng s tin b pht l
t nht.
Bi tp 4-8.
Mt ln Tn Tn ua nga vi vua T. Tn Tn v vua T mi ngi c
t 1 ti , con nga th ca Tn Tn c tc l

con nga nh s

, con nga th ca vua T c tc l

. Lut chi nh sau:

C tt c

cp ua, mi cp ua c mt nga ca Tn Tn v mt nga ca vua T.

Con nga no cng phi tham gia ng mt cp ua

Trong mt cp ua, con nga no tc cao hn s thng, nu hai con nga c cng tc
th kt qu ca cp ua s ho.

Trong mt cp ua, con nga ca bn no thng th bn s c 1 im, ho v thua


khng c im.

Hy gip Tn Tn chn nga ra u


- im ca vua T l ln nht c th.

cp ua vi vua T sao cho hiu s: im ca Tn Tn

Ti liu tham kho


1 Adelson-Velsky, Georgy Maximovich and Landis, Yevgeniy Mikhailovich. An algorithm
for the organization of information. In Proceedings of the USSR Academy of Sciences (
1962), 263-266.
2 Aho, Alfred V., Hopcroft, John E., and Ullman, Jeffrey D. Data Structures and Algorithms.
Addison Wesley, 1983.
3 Bayer, Rudolf. Symmetric binary B-Trees: Data structure and maintenance algorithms.
Acta Informatica, 1 (1972), 290306.
4 Coppersmith, Don and Winograd, Shmuel. Matrix multiplication via arithmetic
progressions. In STOC '87: Proceedings of the nineteenth annual ACM symposium on
Theory of computing (New York, United States 1987), ACM, 1-6.
5 Cormen, Thomas H., E., Leiserson Charles, L., Rivest Ronald, and Clifford, Stein.
Introduction to Algorithms. MIT Press, 2001.
6 Ding, Yuzheng and Weiss, Mark A. Best case lower bounds for heapsort. Computing, 49, 1
(1993), 1-9.
7 Floyd, Robert W. Algorithm 245 - Treesort 3. Communications of the ACM, 7, 12 (1964),
701.
8 Ford, Lester R. Jr. and Johnson, Selmer M. A Tournament Problem. The American
Mathematical Monthly, 66, 5 (1959), 387-389.
9 Hoare, Charles Antony Richard. QuickSort. Computer Journal, 5, 1 (1962), 10-15.
10 Hopcroft, John Edward and Tarjan, Robert Endre. Efficient algorithms for graph
manipulation. Communications of the ACM, 16, 6 (1973), 372-378.
11 Huffman, David Albert. A Method for the Construction of Minimum-Redundancy Codes.
Proceedings of the Institute of Radio Engineers, 40, 9 (1952), 1098-1101.
12 Karatsuba, Anatolii Alexeevich and Ofman, Yu. Multiplication of Many-Digital Numbers
by Automatic Computers. Doklady Akad. Nauk SSSR, 145 (1962), 293-294. Translation in
Physics-Doklady 7, 595-596, 1963.
13 Lacey, Stephen and Box, Richard. A fast, easy sort. BYTE, 16, 4 (1991), 315-ff.
14 Musser, David R. Introspective Sorting and Selection Algorithms. Software: Practice and

Experience, 27, 8 (1997), 983 - 993.


15 Seidel, Raimund G. and Aragon, Cecilia R. Randomized search trees. Algorithmica, 16
(1996), 464-497.
16 Shell, Donald L. A high-speed sorting procedure. Communications of the ACM, 2, 7 (1959),
30-32.
17 Sleator, Daniel Dominic and Tarjan, Robert Endre. Self-Adjusting Binary Search Trees.
Journal of the ACM, 32, 3 (1985), 652-686.
18 Strassen, Volker. Gaussian Elimination is not Optimal. Numerische Mathematik, 13, 4
(1969), 354-356.
19 Tarjan, Robert Endre. Depth first search and linear graph algorithms. SIAM Journal on
Computing, 1, 2 (1972), 146-160.
20 Williams, J.W.J. Algorithm 232: Heapsort. Communications of the ACM, 7, 6 (1964), 347348.

You might also like