Professional Documents
Culture Documents
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:
Tnh bc cu (Transitivity): Nu c
Cc quan h
, hoc
v
c th t suy ra t quan h
;
th bt buc
th
ny.
phn . Khi
c quan h th t ton
nu nh :
hoc dy
ny nh hn tt c cc phn t khc, ta li a v xc
)
)
calculato
computer
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
mt v ch mt 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
ca . Ni cch khc, mt
) ca tp
1
()
ca tp
phn t l
Hon v
Khi
mi song nh
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 .
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 . /
. /
l mt dy
trong
V d vi
, c 8 dy nh phn di 3 c lit k:
( )
000
0
001
1
010
2
011
3
100
4
101
5
110
6
111
7
v dy cui cng l
. Nu ta c mt dy
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
Input
S nguyn dng .
Output
Cc dy nh phn di .
Sample Input
3
Sample Output
000
001
010
011
100
101
110
111
{$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.
phn t
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}
phn t
phn t ca tp
, trong
. Nu sp xp cc dy ny theo th
+.
+ trong
+.
la
l n, ca
, ca
Tng
la
. 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
Ta c cu hnh mi
li nhn thy rng
(
cau h nh mi
c th xy dng nh sau:
Nu tm thy:
Tng
ln 1
t tt c cc phn t
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}
{$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
+ theo th t t in.
V d vi n = 3, c 6 hon v:
(
Mi hon v ca tp
) (
) (
) (
) (
) (
. Theo
v thay n
c xp gim dn, s
) 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
.
Nu tm thy ch s nh trn
nh nht va ln hn
. Do on
o gi tr
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)
{$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
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.
nu nh cha
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).
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
, c tip tc nh vy Mi khi ta tm c
nhn ln lt cc gi tr c th. Vi mi gi tr th
phn t
...
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;
( ).
{$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
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
phn t
phn t ca tp
, y
+ ta c th a v lit k cc cu hnh
l:
(1.1)
) n
)
, vi mi gi
, c nh vy khi chn c
th ta c mt cu hnh cn lit k.
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.
phn t, th tc ny s th chn
ti cn trn
. V
;
l mt trong cc
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.
, cc
ca tp
+ ta c th a v lit k cc
( ) 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
Khi to mt mng
, - cho bit gi tr
- l
Ti bc chn cc gi tr c th ca
ta ch xt nhng gi tr cn t do (
,-
).
l b chn (
) th chn tip
) cc th tc
: ta t gi tr va gn cho
(
),
(
)
va th cho
thnh t do (
,-
), bi khi
gi tr .
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)
{$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
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
( ): 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
v dy
l tng
c th nhn.
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
(1.2)
Tc l nu
c th nhn l
, cn d nhin nu
) th gi tr ln nht
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 :
mang gi tr ng
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
Cui cng gn
Input
S nguyn dng
Output
Cc cch phn tch s .
, 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
{$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;
1.3.6. Bi ton xp hu
Xt bn c tng qut kch thc
qun hu
c ch ra
Ton b hng
Ton b ct
Ton b cc (
) tha mn ng thc
. Nhng ny nm trn mt
Ton b cc (
) tha mn ng thc
. Nhng ny nm trn mt
Vi mi hng s
. Tt c cc (
) trn bn c tha mn
nm
. Tt c cc (
Vi mi hng s
) trn bn c tha mn
N
1
1
2
7
8
3
W
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
Mng
nu
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.
) khng b cc qun hu t
, 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:
) th ta c
, ta nh du ct v 2 ng
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.
, c ngha l sp ti ta li th
tc l ct v 2 ng cho
v 2
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)
{$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 ?
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.
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
chuyn
( )
quy,
(
cn
)
phi
thot
lin
mt
lot
cc
th
tc
quy:
s c ti
nt l, con s ny ln hn rt
, Khi , mt vn t ra
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
bng cu hnh mi va tm c.
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 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
trong
nu
l ma trn i xng:
).
Gi
nu ngi th c chn v
Phng n ti u c lu tr bi mng
tng ng vi dy
-, vi
,
, sau phng n
v bin
.
l s ngi c chn
- bi gi tr
v
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
( ): 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
hin c.
( ) c gi, ta lc ra nhng
,-
v lp gi thuyt rng
-. Th tc
Ngoi ra, th tc
,Nu nh
Ci t
Ta s ci t bi ton Clique vi khun dng Input/Output nh sau:
Input
cch
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,
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
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
, 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
2
2
2
3
2
3
4
2
4
5
2
5
ti
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
ti
na bi nu mun tm ra phng n
c trng lng 1 v gi tr
v sn phm
s c th trc, v khi nu sn
) 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 :
Hm
Ci t
Ta s ci t bi ton xp ba l vi khun dng Input/Output nh sau:
Input
v s thc dng
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
{$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
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;
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.
k t m mi phn t ca dy c chn
Nu dy
th:
+, 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
nh th ny th s k t C trong dy kt qu
(khi chn n
) khng th t hn
k t C trong on
cng nh tnh gi tr , -
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
//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
procedure UpdateSolution;
begin
MinC := CountC;
if m = n then
Best := x;
end;
//Thut ton quay lui
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:
ca tp
Bi tp 1-2.
Hy lit k cc dy nh phn di
Bi tp 1-3.
Nhp vo mt danh sch
ngi trong s
ngi .
Bi tp 1-4.
lit k tt c cc tp con ca tp *
Bi tp 1-5.
Cn xp
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
. Hy lit k cc xu nh phn di
Bi tp 1-9.
Vi
*
ca tp
Bi tp 1-10.
Cho tp
gm
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
Bi tp 1-12.
Lp trnh m s cch xp
qun hu ln bn c
no.
Bi tp 1-13.
M i tun: Cho bn c tng qut kch thc
v mt qun M, hy ch ra mt hnh
nt giao thng nh s t 1 ti
on ng ni chng,
v . Hy in ra tt c cc cch i t
ti
m mi cch i khng
, hy tm mt hon v ca dy (
, 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
ngi th v
cng vic (
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
Ta ni mt bi ton
c th c thc
nhng im mu cht cn lu l:
.
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:
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.
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;
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
ta s c s:
)
cho 2 (
chnh l
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:
, ta thy:
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 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
( )
e
(
) e
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
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
( )
( )
( )
trng), khi :
Nu ( )
Nu ( )
Nu ( )
vi mi gi tr
) vi hng s
) th ( )
, th ( )
) vi hng s
ln th ( )
( ( ))
)
v
( )
( ) vi hng s
. Hy tnh gi tr
Thut ton 1
Ta c th tnh trc tip bng thut ton lp*: Vit mt hm
) tnh
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
Bi ton tnh
c a v bi ton tnh
nu
( ( )
)
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
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
Thut ton 3
Ta xt mt thut ton chia tr khc:
e
{(
e
)
va
chan
va
le
Vic tnh
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:
( )
( )
( )
). Thut ton
, chng ta ch mt 6 php
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.
a.
a cn li ang cc
sang cc
v cui cng li
chng ln a to
nht.
Nh vy chuyn
Vic chuyn
)
a l
bng
quy np:
R rng l tnh cht ny ng vi
, bi ta cn
cu.
Vi
a t cc
a gia hai cc ta cn
php
( ) ( )
( )
( )
. Bi ton t ra l tm a thc
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.
:
( )
t a thc ( ):
( )
(2.1)
( )
( )
( )
( )
(2.2)
( )
(2.3)
( ),
.
( ),
( )
( ) v
( )
( ) u l a thc bc
( )/ .
( ( )
( ))
( )
( )/
( ( ) ( )
( )
. Xt tch ( ) ( ):
( )
( ))
( ) ( )
(2.4)
( )
( )
theo cch:
tnh:
( )
( ))(
( )
( ))
(2.5)
Sau tnh
( )
( )
( )
( )
(2.6)
( )
( )
( ) suy ra tnh ng n ca
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
( )
( )
( )
(2.7)
( )
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
( )
( )
( )
{$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;
SetLength(Result, 4 * k - 1);
for i := 0 to High(P) do
Result[i + 2 * k] := P[i];
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
Bi tp 2-1.
Khi phi lm vic vi cc s ln vt qu phm vi biu din ca cc kiu d liu chun,
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
no chng nhau. V d vi
Bi tp 2-3.
Xt php nhn hai ma trn
c ma trn
(
Ma trn
:
)
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;
).
u c
kch thc
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:
( )
( )
), khng c
con bng thut ton Strassen [18]. Cc php nhn ma trn con cn thc hin l:
(
)(
(
(
)(
)(
Khi :
(
( )
( )
).
Bi tp 2-4.
Trn mt phng cho
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
cha tt
c giao
c giao vi nhiu hn mt
) v
im phn bit:
)
): th tt c cc b i v o khong
, cn cc im nm trn s c chia vo
, cc
gi
, gi
).
ln lt l
v
(
v mt im thuc
th
. Tc l c hai im phi
mt khong
nu cp
so vi .
c chnh lch
chiu.
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.
thnh tng ca dy
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
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
. Khi cc
trong php phn tch, khi s cch phn tch loi ny chnh
, tc l bng
thnh tng cc
Trong trng hp
,
,
- t ,
- v ,
(3.1)
-. Cng thc ny c tn gi l
- 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
- l s dy
; ,
Sample Output
6727090051741041926 Analyses
{$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
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.
th vic lu tr cc hng t 0 ti
l khng cn thit bi v
. Do qu trnh tnh ton ch
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
hng
{$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.
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 .
{$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 ,
{$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.
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 ,
{$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
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
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
(cha
sp xp
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.
nhn ln lt cc gi tr trong dy
vi
ta c th lit k cc s ng
. (
( ))
)
))/
(
)
(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 (
( ))
))
( )
{$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.
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).
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
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-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
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.
th ch cn bit gi tr
l nn vic lu tr cc gi tr
l v
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.
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.
, gii bi ton
cn phi gii bi
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.
). 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
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:
), 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
vo u nhng dy con bt u ti
nh sau: t tt c cc ch s t
,
no ln hn
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)
10
11
10
11
10
11
).
, - 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.
{$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 .
t on cui dy
) vi
bt u t ch s
bt u t
kin ny th ta chn
). Gi:
tho mn: Tn ti dy n
cng tho mn iu
Vi mi ch s (
), gi
n iu tng di nht bt u ti
Chng ta s tnh
, cc gi tr , - v cc gi tr
, on cui dy
()
trong dy con
()
bt u t ch s
()
ch c mt
tng ng vi mt ch s no th
c tnh cht:
(3.6)
c di , dy con ny nu xt t phn t
tnh cc gi tr
()
()
). Vy ta c
tng ng vi ch s
tr
()
()
tng ng vi ch s
nht tha mn
ti
, ta c th lm nh sau:
tm gi tr
, lu li vt
. C th hiu thao tc ny l em
Cp nht li
ln
mi
cu
) v
ni vo u mt dy
. Sau khi ni
vo u mt dy con tng di
ang l phn t bt u
th
d ni
Ln
di 1
di
di
Cp nht
di
di
Nh
Hnh 3-4
{$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
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
v gi tr l
). Cho mt
Input
)
,
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
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 ,
+ vi gii
-: Gi tr ln nht c th c bng
+ c gi tr ln nht
-). Tc l v mt gi tr thu c, ,
- e
* ,
- ,
T cng thc truy hi, ta thy rng tnh cc phn t trn hng ca bng
(3.7)
th ta cn phi
. Vic cn li l ch ra phng n
chn cc sn phm.
Nu ,
tip ,
,
-.
Cn nu ,
v truy tip ,
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;
0
0
-1
-1
-1
-1
-1
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
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 .
bi k t .
(
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
. bin i xu
thnh xu
. Khi :
Nu
th vn tr thnh bin xu
thnh xu
Nu
Hoc chn k t
vo cui xu
-.
ri bin xu
Hoc xa k t cui ca xu
thnh xu
V chng ta cn ,
bi k t
ri bin xu
-
thnh
xu
thnh xu
-
ri bin xu
. 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:
k t u ca
thnh xu rng, n cn ti
hoch ng. T dng cng thc truy hi tnh ra tt c cc phn t bng , sau khi tnh
xong th ,
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
) 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
) thay k
(truy tip
.
v
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
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
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.
l (
thnh
). Mt b
tam gic, ta gi b
, cho mt a gic li
, trong to
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 (
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 (
Gi ,
(3.9)
, 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
no
, ta quan tm ti
Kh nng th nht, nh
, khi ng cho
ang xt, nhng ng cho cn li s phi to thnh mt php tam gic phn nh nht
chia a gic li
),
(3.10)
Kh nng th hai, nh
, khi ng cho
ang xt, nhng ng cho cn li s phi to thnh mt php tam gic phn nh nht
chia a gic li
Kh nng th ba, nh
cho
),
khng trng
(3.11)
, khi c hai ng
v a gic
. Tc
( ),
(3.12)
nn n s phi
,
,
)
( ),
-}
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 ,
-.
0
Bc 5
Bc 4
Bc 3
Bc 2
0
0
Bc 1
C
s
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
bng mt th tc quy.
Ci t
{$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;
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
begin
Enter;
Optimize;
PrintResult;
end.
+ kch thc
v ma trn
+ kch thc
+ kch thc
. Ngi ta c
. Mi phn t ca ma
V d vi
kch thc
(3.16)
(Hnh 3-8).
36
14
34
14
25 100 21
10
11
12
54
22
41 164 33
) 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
th:
sau
php
sau
tnh (
), php tnh (
nhn s hc, ly
sau
php
sau
Trong :
l ma trn kch thc
l ma trn kch thc
Dng 2 cha
(
s nguyn dng
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.
). 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 ,
v ma trn
(3.19)
Trong
ti
vi mt ch s
l ma trn
no .
, nn chi ph ca php kt hp
ti
c ma trn
c ma trn
(
(
-)
,
-)
{ ,
{ ,
,
-
}
-
(3.20)
(3.21)
, vi
Ci t
{$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.
thnh ph v chng c nh s t 1 ti
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
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
). Ti IOI93*, bi
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.
- vi
ph m thi.
N
W
E
S
* ,
-+
-.
, xt ng bay (
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 ,
( ),
).
Trong cc ch s
( ),
V tnh cc i ca ,
Cc gi tr
( ),
tho mn
-}
(3.22)
( ),
v (
) l mt tuyn bay.
,
,
(3.23)
Cc phn t ca bng
- 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
tho mn:
* ,
, ,
-+
(3.24)
v (
- chnh l ,
) l mt tuyn bay.
-
t ,
v tnh cc ,
-(
Dng cc ,
- va tnh c lm c s, tnh cc ,
-(
(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
{$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.
) tu theo
begin
//Tnh cc f[1, 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;
dng c nh s t 1 ti . C tt c
loi b
dng
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
)
(
s nguyn, s th l
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 ,
m dng c
tip theo (
) l dng c th thi gian t nht lp ln lt cc b phn
, - s c tnh bng:
: ,
, trong b
V chng ta mun ,
lp
Bng phng n
* ,
hng,
-+
(3.25)
s c
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
,
no , chng ta t:
* ,
- lp b phn
-+
(3.26)
. 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
) 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:
,-
* ,
, -+
(3.27)
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;
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;
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
( ) 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
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
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
)(
) v mt s
. Hy
Gi : Tm cng thc truy hi tnh , - l ch s nh nht tho mn: tn ti cch chn trong
dy
, -
Bi tp 3-3.
(
Cho dy s t nhin
). Ban u cc phn t ca
ng th t cch nhau bi du ?:
Yu cu: Cho trc s nguyn
. Bit rng
, vi
s c phng n
nh s t 1 ti
), cc hng ca li c
v cc ct ca li c nh s t 1 ti , trn mi ca li ghi mt s
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
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
Bi tp 3-7.
Mt s nguyn dng
s ca
c
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 di khng qu 1000, hy
Bi tp 3-9.
C
dng
c mnh gi l l mt s nguyn
) 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
. Xem hnh v:
Bit rng
v s ghi di 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 :
Xt bng
} kch thc
, cc hng v cc ct c nh ch s A, B, C, D. Trn 16
A
B
C
D
Cho xu
k t
ch gm cc ch ci *
-. V d:
bi k t ,
*
+. (
). Xt php co ( ): thay
+, hy ch ra th t thc hin
php co k
n v thi gian
, bn s thu c s tin l
v cc gi tr
Cho dy s nguyn
dng
) (
| |
) v mt s nguyn
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
). Cn b th
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:
ng.
ng trong phng n ti u th vn cn li l i
ng, quy
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.
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.
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.
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.
+, th tt c
k t qu tm c v
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
, v vy vic thay
bi
) cng s l mt phng n ti u.
nhim v. iu ny c
lm nhim v u tin.
Chn
kt thc: , -
, -
Chn
kt thc: , -
, -
Khi to thi im
vo phng n ti u v cp nht
,thc nhim v :
thnh thi im kt
{$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.
).
4.3.2. Ph
Trn trc s cho
on: ,
on cho ph ht on ,
-,
-.
Input
)
(
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.
- bng
-, ta gi
l cn di
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
] v [
] 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 [
] c cn trn ln nht ph c im
vo phng n ti u.
] c
ln nht tha mn
]. Nu on ny ph ht on ,
ln nht v ph c im
Nhn xt:
] c
] [
] [
-:
Bc 2: Nu
. Tm trong
ln nht vo phng n ti u.
, cp
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
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
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
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
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
Mt xu k t
l tp cc k t, mi k t
( ) bit th
s bit trong bn nn l:
( )
( ) ( )
(4.1)
( ) cng l su ca nt
K t tng ng vi nt nu l nt l ( )
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
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 :
Hm
qu hm
Th tc
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
s biu din
khng ti u.
B 4-4
Gi
cha
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
( )
, ( )
( ( )
( )
( )
( )
( )
( ))(
( )( )
( )
iu ny ch ra rng nu o hai nt
( )
( )
( )
( )
( )
( )
, ng thi
v , ta s c cy
, ( )
( )-
( )
(4.2)
( ))
. T cy
( )
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
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
, ta s c cy
l cy ti u trn .
( )
( )
( )
( )
( ( )
( )
T suy ra ( )
( )
( )
vi tn sut ( )
( ( )
( ) hay ( )
( )
(4.3)
( ))
( )
( ).
( )
( )
( )
( ))(
. Trong :
( )
( )
( )
( )
( )
(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
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
v , a nt
) mt nt , c nt
vo gc Heap ln nt
gc Heap (
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
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
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;
begin
ReadLn(s);
InitHeap;
BuildTree;
Traversal(TreeRoot, 0);
end.
l s k t (s nt l
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
li l nh nht c th.
Input
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
) x l ln lt cc li t 1 ti
(
) c c bng cch o th t x l
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
(
gy ra l:
(4.5)
), thit hi ca hai li v
(
v ). Khi :
), thit hi ca hai li v
(
v lch trnh
gy ra.
thit hi
l lch trnh ti
gy ra l:
(4.6)
(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
th
c cng mc
()
()
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
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.
v hai my
chi tit nh s
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
Input
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
(
v chi tit
). Hn na nu
) th vic o th t gia
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
: cho bit chi tit bt buc phi gia cng trc chi
(
{$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)
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
v nhm
gm cc
theo th t tng dn ca cc
theo th t gim dn ca cc
, sp
xp li.
Bi tp 4-1.
Bn l ngi lp lch ging dy cho
im
im en v
on, mi on
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
t u ca c hai hng i
To ra mt nt lm nt cha ca hai nt
y vo cui hng i 2
v gi tr , nu ta ly mt phn trng
ca sn phm th s c gi tr l
. Ch ra rng hm
trong
li xe trong mt chuyn hnh trnh uyn Vit t Cao Bng ti C Mau di km.
Dc trn ng i c
khi y c th i c
. Hy ch ra t nht cc on dng ,
l s nguyn ph ht
- vi
im cho.
Bi tp 4-7.
Bn c
. 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
C tt c
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.