Professional Documents
Culture Documents
Chng I: C s l thuyt
I.1. T tng ca phng php quy hoch ng
I.1.1. Thut ton chia tr
Lp trnh ng cng nh chia tr l cc phng php gii mt bi ton
bng cch t hp li gii cc bi ton con ca n.
Thut ton chia tr c coi l thut ton thng dng nht trong Tin
hc. Khi gii mt bi ton P vi kch thc ban u no nu gp tr ngi v
kch thc qu ln, ngi ta thng ngh n vic gii cc bi ton tng t
nhng vi kch thc nh hn (gi l cc bi ton con ca P). T tng chia
tr thng c nhc ti nh hnh nh b dn tng chic a b gy c
b a.
Chia tr thc hin tch mt bi ton ban u thnh cc bi ton con
c lp, sau gii cc cc bi ton con ny v t hp dn li gii t bi ton
con nh nht n bi ton ban u.
Nhng gii tng bi ton con nh th no? Chng ta c th thc hin mt
cch n gin li tch bi ton con thnh cc bi ton con nh hn na, v
c tin hnh nh vy cho n khi gp cc bi ton con nh n mc d dng
gii c. Cc bi ton con cng c sinh ra sau mi ln tch c gi l
cng mc. Nhng bi ton con sinh ra sau hn th mc di (thp hn).
Th tc quy lun l cch thng dng v hiu qu thc hin thut
ton chia tr. Qu trnh quy ln lt xp dn cc bi ton con vo ngn
xp b nh v s thc hin gii cc bi ton con theo th t ngc li t bi
ton n gin nht trn nh ngn xp cho n khi gii c bi ton ban u
y ngn xp.
V d: Cho mng a[1..n] gm cc s sp tng. Tm phn t ca mng c
gi tr bng s x cho trc.
3
Xt chng trnh thc hin thut ton tm kim nh phn (mt kiu chia
tr rt ph bin) gii bi ton trn. Trong chng trnh chnh c li gi
th tc tim(1,n). Sau y l th tc tim(i,j):
Procedure tim(i,j : integer); {Tim x c trong mng a[i .. j] hay khng}
Var k : integer;
Begin
K := (i+j) div 2;
If a[k] = x then
Begin
Write(Co phan tu bang ,x);
Halt;
End
Else
If (a[k] < x) and (k<j) then tim(k+1,j)
Else
If (a[k] > x) and (k>i) then tim(i,k -1)
End;
Do ch tm kim trn mt trong hai phn c tch ra, nn phc tp
thut ton l O(log2n), tt hn l tm kim tun t.
I.1.3. Lp trnh ng l g?
Lp trnh ng ging phng php chia tr ch: li gii ca bi ton
c t hp t li gii cc bi ton con.
Chia tr s phn chia bi ton ban u thnh cc bi ton con c lp
(s phn chia c cu trc dng cy), gii cc bi ton con ny thng bng
quy, sau t hp li gii ca chng c li gii ca bi ton ban u.
5
I.2.2. T chc ci t:
- C th dng vng lp
- Hoc dng quy
- Nghim ca cc bi ton con c tnh ton 1 ln v lu tr trong mng
khi cn ly mng ra v s dng
Chng II: Mt s bi tp c bn
Bi 1: Tm dy con khng gi m nhiu phn t nht;
Cho dy s nguyn c n phn t a1, a2, , an. Mt dy con khng gim ca
dy cho l dy cc phn t cn li ca dy sau khi ta xa b mt hoc
mt s phn t bt k ca n, cc phn t ca dy con to thnh dy khng
gim. V d: dy 1,4,10,11,12 l mt dy con khng gim ca dy 1, 4, 10, 9, 8,
17, 11, 7, 12, 6.
Yu cu: Tm dy con khng gim ca dy a gm nhiu phn t nht.
D liu: Vo t file vn bn DAYCON.INP gm:
Dng u tin ghi s N (0 < N < 10 5).
Cc dng tip theo, mi dng ghi 10 s nguyn ca dy N s nguyn a 1, a2,
.., an. Dng cui cng c th t hn 10 s. Cc s trn mt dng cch nhau mt
du cch.
Kt qu: Ghi ra file vn bn DAYCON.OUT gm:
S max l di dy con khng gim di nht tm c.
Ch s xut hin ca cc s hng ca dy con trong dy cho.
V d:
DAYCON.INP
DAYCON.OUT
10
6 5 8 12 6 9 7 13 2 13
2 5 7 8 10
Hng dn:
Gi L(i) l di dy con tng di nht, cc phn t ly trong min t a1
n ai v phn t cui cng l a i.
Ta c cng thc QH tnh L(i) nh sau:
L(1) = 1
L(i) = max(1, L(j)+1 vi mi phn t j: 0 < j < i v a j ai).
10
f:text;
a:arrA;
n,kq,luu,dem:longint;
d,truoc,k:arrA;
procedure
var
init;
i:longint;
begin
assign(f,fi);
reset(f);
11
readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
end;
procedure
var
process;
i,j:longint;
begin
for i:=1 to n do
truoc[i]:=i;
d[1]:=1;
for i:=1 to n do
begin
d[i]:=1;
for j:=1 to i-1 do
if a[i]>=a[j] then
if d[j]+1>d[i] then
begin
d[i]:=d[j]+1;
truoc[i]:=j;
end;
end;
kq:=0;
for i:=1 to n do
if d[i]>kq then begin kq:=d[i];luu:=i;end;
dem:=0;
12
while truoc[luu]<>luu do
begin
inc(dem);
k[dem]:=luu;
luu:=truoc[luu];
end;
inc(dem);
k[dem]:=luu;
end;
procedure
var
inkq;
i:longint;
begin
assign(f,fo);
rewrite(f);
writeln(f,kq);
for i:=dem downto 1 do
write(f,k[i],' ');
close(f);
end;
BEGIN
init;
process;
inkq;
END.
DAYCC.OUT
76
3513553
22
153531
43
64
75
*Hng dn:
Gi L(i,j) l di dy con chung di nht ca dy a(i) gm i phn t
phn u ca dy a (a(i) = a[1..i]) v dy b(j) gm j phn t phn u ca dy b
14
(b(j)
=b [1..j]).
f[i,j] := f[i-1,j-1] + 1;
End;
Procedure result;
var i,j:integer;
Begin
assign(g,fo); rewrite(g);
writeln(g,f[m,n]);
i := m; j := n;
while (i<>0) and (j<>0) do
Begin
if a[i] = b[j] then
Begin
writeln(g,i,' ',j);
dec(i);
dec(j);
End
else
16
Begin
if f[i,j] = f[i-1,j] then dec(i)
else if f[i,j] = f[i,j-1] then dec(j);
end;
end;
close(g);
End;
BEGIN
init;
build;
result;
END.
Tongs.out
8 39
19 20
19 5 20 13 16 20 18 2
* Hng dn:
17
'c'.
Ta c th tnh L(i,t) theo cng thc: L(i,t) = 1 nu L(i - 1,t)=1 hoc L(i-1,t a[i])=1.
* Chng trnh ci t:
Program day_con_tong_s;
uses crt;
const fi='tongs.inp';
fo='tongs.out';
max=6400;
maxn=200;
type arrA=array[1..maxn]of longint;
arrB=array[0..max]of longint;
var
f:text;
n:longint;
a,truoc:arrA;
s:longint;
d:arrB;
procedure
var
init;
i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n,s);
for i:=1 to n do
18
read(f,a[i]);
close(f);
end;
procedure
var
process;
i,j:longint;
begin
for i:=1 to s do d[i]:=0;
for i:=1 to n do
for j:=s downto a[i] do
begin
if (d[j]=0) and (d[j -a[i]]=1) then
begin
d[j]:=1;
truoc[j]:=i;
end;
if d[s]<>0 then exit;
end;
end;
procedure inkq;
var i:longint ;
begin
assign(f,fo);rewrite(f);
if d[s]=0 then write(f,'0')
else
begin
i:=truoc[s];
19
while s<>a[i] do
begin
write(f,a[i],' ');
s:=s-a[i];
i:=truoc[s];
end;
write(f,a[i]);
end;
close(f);
end;
BEGIN
init;
process;
inkq;
END.
Bi 4: Xp vt vo ba l (mi vt ch c 1)
Mt chic ba l c th cha c mt khi lng khng qu W. C N
vt c nh s t 1 n N, vt i c khi lng Ai v gi tr s dng Ci (i=1,
2, ,N). Hy chn cc vt xp vo ba l sao cho tng gi tr cc vt
trong ba l l ln nht (nu c th xp c).
D liu: vo t file vn bn BALO.INP c cu trc nh sau:
Dng u ghi 2 s nguyn dng N, W (0 < N,W < 100).
Dng th i+1, vi i=1,2,..,N, ghi 2 s nguyn dng Ai v Ci tng ng l
khi lng v gi tr s dng ca vt th I (0 < Ai, Ci < 256).
Kt qu: Ghi ra file vn bn BALO.OUT c cu trc:
Dng u ghi tng gi tr s dng ln nht tm c.
20
Dng 2 ghi ch s cc vt c xp vo ba l.
V d:
BALO.INP
BALO.OUT
7 20
40
3 9
1 2 6 7
8 23
23 4
29 34
12 4
1 2
8 6
*Hng dn
Gi L(i,t) l tng gi tr ln nht khi c chn i vt t 1 n i cho vo
bal vi tng khi lng khng vt qu t.
L(n,m) s l p s ca bi ton (l gi tr ln nht c c nu chn n vt
v tng khi lng khng vt m).
Cng thc tnh L(i,t) nh sau:
L(i,0)=0; L(0,t)=0.
L(i,t)=L(i1,t) nu t<Ai.
L(i,t)=max(L(i1,t), L(i1,tai)+bi) nu t ai. Trong : L(i1,t) l gi tr c
c nu khng a vt i vo bal, L(i1,tai)+bi l gi tr c c nu chn vt
i.
Ta c th dng mt mng 2 chiu lu bng phng n, tuy nhin d a
trn nhn xt rng tnh dng i ca bng phng n ch cn dng i1, ta ch
cn dng 2 mng mt chiu P v L c ch s t 0 n m lu 2 dng . on
chng trnh con tnh bng phng n nh sau.
21
L[t] := 0; {vi mi t}
for I := 1 to n do begin
P:=L;
for t := 0 to m do
if t< L[t]:="P[t]" then> else L[t] := max(P[t],P[t a[i]]);
end;
Nu k bn s thy rng on trnh trn ch vit ging cng thc
QH ch cha ti u. Chng hn c lnh gn P:=L, sau li c gn
L[t]:=P[t] vi cc gi tr t < a[i] l khng cn thit. Bn c c th t ci tin
chng trnh ti u hn. Chi ph khng gian ca cch ci t trn l O(m) v chi
ph thi gian l O(n.m).
*Chng trnh ci t:
program
xep_do_vat;
uses crt;
const fi='balo.inp';
fo='balo.out';
max=10000;
type arrA=array[1..max]of longint;
arrB=array[0..max]of longint;
var
f:text;
n,w,kq,luu:longint;
a,c :arrA;
d,gt:arrB;
truoc:arrA;
procedure
var
init;
i:longint;
22
begin
assign(f,fi);
reset(f);
readln(f,n,w);
for i:=1 to n do
readln(f,a[i],c[i]);
for i:=1 to w do
begin
d[i]:=0;
truoc[i]:=0;
gt[i]:=0;
end;
close(f);
kq:=0;
end;
procedure
var
process;
i,j:longint;
begin
d[0]:=1; gt[0]:=0;
for i:=1 to n do
begin
for j:=w downto a[i] do
if (d[j-a[i]]=1) then
if gt[j-a[i]]+c[i]>gt[j] then
begin
d[j]:=1;
23
gt[j]:=gt[j-a[i]]+c[i];
truoc[j]:=i;
if gt[j]>kq then
begin
kq:=gt[j];
luu:=j;
end;
end;
write(i,' ',truoc[87]);
readln;
end;
end;
procedure
inkq;
var i :longint;
begin
assign(f,fo);
rewrite(f);
writeln(f,kq);
i:=truoc[luu];
while luu>a[i] do
begin
write(f,i,' ');
luu:=luu-a[i];
i:=truoc[luu];
end;
write(f,i);
24
close(f);
end;
BEGIN
init;
process;
inkq;
END.
25
ACTIVITY.OUT
13
24
16
35
79
26
* Hng dn:
Sp xp cc cuc hp tng dn theo thi im kt thc (bi). Th th cuc
hp i s b tr c sau cuc hp j nu v ch nu j < i va` b j ai. Yu cu b tr
c nhiu cuc hp nht c th a v vic tm dy cc cuc hp di nht
tho mn iu kin trn
* Chng trnh ci t:
program
bo_tri_phong_hop;
uses crt;
const fi='activity.inp';
fo='activity.out';
max=1000000;
type arrA=array[1..max]of longint;
arrB=array[1..max,1..max]of longint;
var
f:text;
n,luu,kq,dem:longint;
a,b,truoc,cs:arrA;
d,k:arrA;
procedure
var
init;
i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
begin
readln(f,a[i],b[i]);
27
cs[i]:=i;
end;
close(f);
end;
procedure
var
sap_xep;
i,j,tg:longint;ok:boolean;
begin
for i:=1 to n-1 do
begin
ok:=true;
for j:=n downto i+1 do
if b[j]<b[j-1] then
begin
tg:=b[j];b[j]:=b[j -1];b[j-1]:=tg;
tg:=a[j];a[j]:=a[j-1];a[j-1]:=tg;
tg:=cs[j];cs[j]:=cs[j -1];cs[j-1]:=tg;
ok:=false;
end;
if ok then exit;
end;
end;
procedure
process;
var i,j:longint;
begin
d[1]:=1;
for i:=1 to n do
28
truoc[i]:=i;
for i:=2 to n do
begin
d[i]:=1;
for j:=1 to n-1 do
if b[j]<=a[i] then
if d[j]+1>d[i] then
begin
d[i]:=d[j]+1;
truoc[i]:=j;
end;
end;
kq:=-1;
for i:=1 to n do
if d[i]>kq then begin kq:=d[i];luu:=i;end;
while luu<>truoc[luu] do
begin
inc(dem);
k[dem]:=luu;
luu:=truoc[luu];
end;
inc(dem);
k[dem]:=luu;
end;
procedure
inkq;
var i:longint;
29
begin
assign(f,fo);
rewrite(f);
writeln(f,kq);
for i:=dem downto 1 do
writeln(f,cs[k[i]]);
close(f);
end;
BEGIN
init;
sap_xep;
process;
inkq;
END.
RENTING.OUT
RENTING.INP
RENTING.OUT
2 180
2 1100
2 3
2 4
200 100
400 800 80
*Hng dn:
Tng t nh bi ton 2, nu sp xp cc n t hng theo thi im
kt thc, ta s a c bi ton 3 ny v bi ton tm dy con c t ng ln
nht.
* Chng trnh ci t:
program cho_thue_may_tinh;
uses crt;
const fi='renting.inp';
fo='renting.out';
max=1000;
type arrA=array[1..max]of int64;
arrB=array[1..max,1..max]of longint;
var
f:text;
a,b,c:arrA;
n,kq,luu,dem:longint;
31
d,cs,truoc,k:arrA;
procedure
var
init;
i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
begin
readln(f,a[i],b[i],c[i]);
cs[i]:=i;
end;
close(f);
end;
procedure
var
sap_xep;
i,j,tg:longint;ok:boolean;
begin
for i:=1 to n-1 do
begin
ok:=true;
for j:=n downto i+1 do
if b[j]<b[j-1] then
begin
tg:=b[j];b[j]:=b[j -1];b[j-1]:=tg;
tg:=a[j];a[j]:=a[j -1];a[j-1]:=tg;
tg:=cs[j];cs[j]:=cs [j-1];cs[j-1]:=tg;
32
tg:=c[j];c[j]:=c[j -1];c[j-1]:=tg;
ok:=false;
end;
if ok then exit;
end;
end;
procedure
process;
var i,j:longint;
begin
d[1]:=c[1];
for i:=1 to n do
truoc[i]:=i;
for i:=2 to n do
begin
d[i]:=c[i];
for j:=1 to n-1 do
if b[j]<=a[i] then
if d[j]+c[i]>d[i] then
begin
d[i]:=d[j]+c[i];
truoc[i]:=j;
end;
end;
kq:=-1;
for i:=1 to n do
if d[i]>kq then begin kq:=d[i];luu:=i;end;
33
while luu<>truoc[luu] do
begin
inc(dem);
k[dem]:=luu;
luu:=truoc[luu];
end;
inc(dem);
k[dem]:=luu;
end;
procedure
inkq;
var i:longint;
begin
assign(f,fo);
rewrite(f);
writeln(f,dem,' ',kq);
for i:=dem downto 1 do
write(f,cs[k[i]],' ');
close(f);
end;
BEGIN
init; sap_xep;
process;
inkq;
END.
Bi 7: Ni im
Trn hai ng thng song song L1 v L2 ng i ta nh du trn mi
ng N im. Cc im trn ng thng L1 c nh s t 1 n N t tri
34
WIRE.OUT
2 5 3 8 7 4 6 9 1
3 4 6 9
*Hng dn:
y chnh l bi ton 1: Tm dy con khng gi m di nht
* Chng trnh ci t:
program day_con;
uses crt;
35
const fi='wires.inp';
fo='wires.out';
max=1000;
type arrA=array[0..max]of longint;
arrB=array[1..max,1..max]of longint;
var
f:text;
a:arrA;
n,kq,luu,dem:longint;
d,truoc,k:arrA;
procedure
var
init;
i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
end;
procedure
var
process;
i,j:longint;
begin
for i:=1 to n do
truoc[i]:=i;
d[1]:=1;
for i:=1 to n do
36
begin
d[i]:=1;
for j:=1 to i-1 do
if a[i]>=a[j] then
if d[j]+1>d[i] then
begin
d[i]:=d[j]+1;
truoc[i]:=j;
end;
end;
kq:=0;
for i:=1 to n do
if d[i]>kq then begin kq:=d[i];luu:=i;end;
dem:=0;
while truoc[luu]<>luu do
begin
inc(dem);
k[dem]:=luu;
luu:=truoc[luu];
end;
inc(dem);
k[dem]:=luu;
end;
procedure
var
inkq;
i:longint;
begin
37
assign(f,fo);
rewrite(f);
writeln(f,kq);
for i:=dem downto 1 do
write(f,a[k[i]],' ');
close(f);
end;
BEGIN
init;
process; inkq;
END.
V d:
DOICHIEU.INP
DOICHIEU.OUT
10 2 3
-1 3 -4 13 6 9 -2 12 -3 15
1 3 7 9
* Hng dn:
Gi L(i) l s phn t ca dy con i du c phn t cui cng l a i v
phn t cui cng ln hn phn t ng trc. Tng t, P(i) l s phn t
ca dy con i du c phn t cui cng l a i v phn t cui cng nh hn
phn t ng trc. Ta d dng suy ra:
L(i) = max(1, P(j)+1): j i - L v ai - U aj < ai.
P(i) = max(1, L(j)+1): j i - L v ai < aj ai + U.
* Chng trnh ci t:
program
day_con_doi_chieu_dai_nhat;
uses crt;
const fi='doichieu.inp';
fo='doichieu.out';
max=100000;
type arrA=array[1..max]o f longint;
arrB=array[1..max,1..max]of longint;
var
f:text;
n,l,u,luu,kq,cs,dem:longint;
a:arrA;
d1,d2,truoc1,truoc2,k:arrA;
procedure
var
init;
i:longint;
begin
39
assign(f,fi);
reset(f);
readln(f,n,l,u);
for i:=1 to n do
begin
read(f,a[i]);
truoc1[i]:=i;
truoc2[i]:=i;
end;
close(f);
end;
procedure
var
process;
i,j:longint;ok:boolean;
begin
d1[1]:=1;
d2[1]:=1;
for i:=2 to n do
begin
d1[i]:=1;
for j:=1 to i-l do
if a[i]>=a[j] then
if abs(a[i]-a[j])<=U then
if d2[j]+1>d1[i] then
begin
d1[i]:=d2[j]+1;
truoc1[i]:=j;
40
end;
d2[i]:=1;
for j:=1 to i-l do
if a[i]<=a[j] then
if abs(a[i] -a[j])<=U then
if d1[j]+1>d2[i] then
begin
d2[i]:=d1[j]+1;
truoc2[i]:=j;
end;
end;
kq:=-1;
for i:=1 to n do
begin
if d1[i]>kq then begin kq:=d1[i];cs:=1;luu:=i;end;
if d2[i]>kq then begin kq:=d2[i];cs:=2;luu:=i;end;
end;
end;
procedure
truy_xuat;
var ok:boolean;
begin
ok:=false;
dem:=0;
repeat
inc(dem);
k[dem]:=luu;
41
if cs=1 then
begin
if luu=truoc1[luu]then
exit
else
begin
luu:=truoc1[luu];
cs:=2;
end;
end
else
begin
if luu=truoc2[luu] then
exit
else
begin
luu:=truoc2[luu];
cs:=1;
end;
end;
until ok;
end;
procedure
var
inkq;
i:longint;
begin
assign(f,fo);
42
rewrite(f);
writeln(f,kq);
for i:=dem downto 1 do
write(f,k[i],' ');
close(f);
end;
BEGIN
init; process;
truy_xuat; inkq;
END.
xu
Y.
BIENDOI.OUT
kitten
sitting
* Hng dn:
43
f:text;
m,n:longint;
d:arrB;
44
a,b:arrA;
procedure
init;
begin
assign(f,fi);
reset(f);
m:=0;
while not eoln(f) do
begin
inc(m);read(f,a[m]);
end;
readln(f);
n:=0;
while not eof(f) do
begin
inc(n);read(f,b[n]);
end;
close(f);
end;
function min3so(x,y,z:longint):longint;
var tam:longint;
begin
if x<y then tam:=x
else tam:=y;
if z<tam then tam:=z;
min3so:=tam;
end;
45
procedure
var
process;
i,j:longint;
begin
for i:=1 to m do d[i,0]:=i;
for j:=1 to n do d[0,j]:=j;
for i:=1 to m do
for j:=1 to n do
begin
if a[i]=b[j] then d[i,j]:=d[i -1,j-1]
else
d[i,j]:=min3so(d[i -1,j-1],d[i,j-1],d[i-1,j])+1;
end;
end;
procedure
inkq;
begin
assign(f,fo);
rewrite(f);
writeln(f,d[m,n]);
close(f);
end;
BEGIN
init;
process;
inkq;
END.
46
Bi 10: Xu i xng;
Mt xu gi l xu i xng (palindrom) nu xu c t tri sang phi
hay t phi sang tri u nh nhau. Cho mt xu S, hy tm s k t t nht cn
thm vo S S tr thnh xu i xng.
V d: Cho xu S=abcda th s k t t nht cn chn thm l 2
D liu: Vo t file vn bn XDX.INP l 1 xu S c khng qu 500 k t )
Kt qu: Ghi ra file vn bn XDX.OUT l s lng k t t nht cn thm;
V d:
XDX.INP
XDX.OUT
abcda
*Hng dn:
Gi L(i,j) l s k t t nht cn thm vo xu con S[i..j] c a S xu tr
thnh i xng. p s ca bi ton s l L(1,n) vi n l s k t ca S. Ta c
cng thc sau tnh L(i,j):
L(i,i)=0.
L(i,j)=L(i+1,j - 1) nu S[i]=S[j]
L(i,j)=max(L(i+1,j), L(i,j - 1)) nu S[i] S[j] ;
Ta c thut ton n gin hn nh sau:
Gi P l xu o ca S v T l xu con chung di nh t ca S v P. Khi
cc k t ca S khng thuc T cng l cc k t cn thm vo S tr thnh i
xng. p s ca bi ton s l n - k, vi k l di ca T. V d:
S=<b>edbabcd, xu o ca S l P=<b>dcbabde. Xu con chung di nh t ca S
v P l T=<b>dbabd. Nh v y cn thm 2 k t l e v c vo S tr thnh xu
i xng;
*Chng trnh ci t:
program xau_doi_xung;
47
uses crt;
const fi='palin.inp';
fo='palin.out';
max=5000;
type arrA=array[1..max]of char;
arrB=array[1..max,1..max]of longint;
var
a:arrA;
l:arrB;
f:text;
n:integer;
procedure
init;
var i:integer;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do read(f,a[i]);
close(f);
end;
function min2so(x,y:longint):longint;
begin
if x>y then min2so:=y
else min2so:=x;
end;
procedure
process;
var i,j:longint;
48
begin
for i:=1 to n do
l[i,i]:=0;
for i:=1 to n-1 do
for j:=1 to n-i do
begin
if a[j]=a[j+i]then
begin
if i=1 then l[j,j+i]:=0
else
l[j,j+i]:=l[j+1,j+i -1];
end
else
l[j,j+i]:=min2so(l[j+1,j+i],l[j,j+i -1])+1;
end;
end;
procedure
inkq;
begin
assign(f,fo);
rewrite(f);
writeln(f,l[1,n]);
close(f);
end;
BEGIN
init;
process;
49
inkq;
END.
CHIAKEO.OUT
8
1 56 57
19 5 20 13 16 20 18 2 3 5 6
12478
*Hng dn:
Gi T l tng s ko ca n gi. Chng ta cn tm s S ln nht tho mn:
S T/2.
C mt dy con ca dy a c tng bng S. Khi s c cch chia vi
chnh lch 2 phn l T- 2S l nh nht v dy con c tng bng S trn gm
cc phn t l cc gi ko thuc phn th nht. Phn th hai l cc gi ko
cn li.
* Chng trnh ci t:
program
chia_keo;
50
uses crt;
const fi='chiakeo.inp';
fo='chiakeo.out';
max=100;
var
a:array[1..max]of integer;
n:integer;
t,k:integer;
s:array[0..max,0..10000]of integer;
f:text;
t1,lech:integer;
cx:array[1..max]of boolean;
procedure
init;
var i:integer;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]);
close(f);
k:=0;
for i:=1 to n dok:=k+a[i];
t:=k div 2;
for i:=1 to n do s[i,0]:=1;
for i:=1 to t do s[0,i]:=0;
for i:=1 to n do cx[i]:=true;
51
end;
procedure
process;
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to t do
begin
s[i,j]:=0;
if s[i-1,j]=1 then s[i,j]:=1;
if j>=a[i] then
if s[i-1,j-a[i]]=1 then s[i,j]:=1;
end;
end;
procedure xu_li;
var i,j:integer;
begin
for i:=t downto 1 do
begin
for j:=1 to n do
if s[j,i]=1 then
begin
t1:=i;
lech:=k-2*i;
exit;
end;
end;
52
end;
procedure
truy_ket_qua;
var tam,i,t2:integer;
begin
tam:=t1;
t2:=n;
repeat
for i:=1 to t2 do
if s[i,tam]=1 then
begin
t2:=i;
tam:=tam-a[i];
cx[i]:=false;
break;
end;
until (tam=0);
end;
procedure
inkq;
var i:integer;
begin
assign(f,fo);
rewrite(f);
writeln(f,lech,' ',t1,' ',k-t1);
for i:=1 to n do if cx[i]=false then write(f,i,' ');
writeln(f);
for i:=1 to n do if cx[i]=true then write(f,i,' ');
53
close(f);
end;
BEGIN
init;
process;
xu_li;
truy_ket_qua;
inkq;
END.
MARKET.OUT
7
54
* Hng dn:
Thc cht bi ton l tm cc s S m c mt dy con ca dy a c tng
bng S. Ta c th dng phng php nh du ca bi chia ko trn ri m
cc gi tr t m L[t]=1.
* Chng trnh ci t:
program so_ca;
uses crt;
const fi='market.inp';
fo='market.out';
maxn=10000;
max=1000000;
type arrA=array[1..maxn]of longint;
arrB=array[0..max]of longint;
var
f:text;
a:arrA;
s,dem,n:longint;
d:arrB;
procedure
init;
var i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n);
s:=0;
for i:=1 to n do
begin
55
read(f,a[i]);
s:=s+a[i];
end;
close(f);
end;
procedure
var
process;
i,j:longint;
begin
for i:=1 to s do
d[i]:=0;
d[0]:=1;
for i:=1 to n do
for j:=s downto a[i] do
begin
if (d[j]=0) and (d[j -a[i]]=1) then
begin
d[j]:=1;
inc(dem);
end;
end;
end;
procedure
inkq;
begin
assign(f,fo);
rewrite(f);
writeln(f,dem);
56
close(f);
end;
45678
-+++
*Hng dn:
t L(i,t)=1 nu c th in du vo i s u tin v cho kt qu bng t.
Ta c cng thc sau tnh L:
L(1,a[1]) =1.
L(i,t)=1 nu L(i - 1,t+a[i])=1 hoc L(i - 1,t - a[i])=1.
Nu L(n,S)=1 th cu tr li ca bi ton l c. Khi ci t, c th dng
mt mng 2 chiu (lu ton b bng phng n) hoc 2 mng mt chiu (
57
* Chng trnh ci t:
program
dau_hoi;
uses crt;
const fi='daudoi.inp';
fo='dauhoi.out';
max=10000;
maxs=100000;
type arrA=array[1..max]of longint;
arrB=array[0..maxs]of longint;
var
f:text;
n,s,tong:longint;
a:arrA;
d:arrB;
ok:boolean;
truoc:arrA;
co:array[1..max]of boolean;
procedure
init;
58
var
i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n,s);
tong:=0;
for i:=1 to s do
begin
read(f,a[i]);
tong:=tong+a[i];
co[i]:=true;
end;
ok:=true;
if tong<s then ok:=false;
tong:=tong-s;
if tong mod 2 <>0 then
ok:=false
process;
i,j:longint;
begin
for i:=1 to tong do
d[i]:=0;
d[0]:=1;
59
for i:=1 to n do
for j:=tong downto a[i] do
begin
if (d[j]=0) and (d[j -a[i]]=1) then
begin
d[j]:=1;
truoc[j]:=i;
end;
if d[tong]<>0 then exit;
end;
end;
procedure
inkq;
var luu,i:longint;
begin
assign(f,fo);
rewrite(f);
if (d[tong]=0) or (truoc[tong]=1) then
ok:=false
else
begin
s:=tong;luu:=truoc[s];
while s<>a[luu] do
begin
co[luu]:=false;
s:=s-a[luu];
luu:=truoc[s];
60
end;
co[luu]:=false;
end;
if ok then
begin
writeln(f,'1');
for i:=2 to n do
begin
if co[i] then write(f,'+')
else write(f,'-');
end;
end
else write(f,'0');
close(f);
end;
BEGIN init;
if ok then process; inkq;
END.
V d:
EXPRESSION.INP
EXPRESSION.OUT
56
1 2 3 4 5
*Hng dn:
Gi T l tng n s nguyn . Gi s ta chia dy thnh 2 nhm, gi S l
tng ca mt nhm, tng nhm cn li l T - S v tch ca tng 2 nhm l S*(T S). Bng phng php nh du ta xc nh c mi s S l tng ca mt
nhm (nh bi Market) v t m s S sao cho S*(T - S) t max.
*Chng trnh ci t:
uses crt;
const fi='expression.inp';
fo='expression.out';
max=10000;
maxs=100000;
type arrA=array[1..max]of longint;
arrB=array[0..maxs]of longint;
var
f:text;
n,s,tong:longint;
a:arrA;
d:arrB;
ok:boolean;
procedure
var
init;
i:longint;
62
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
begin
read(f,a[i]);
tong:=tong+a[i];
end;
close(f);
end;
procedure
var
process;
i,j:longint;
begin
for i:=1 to s do
d[i]:=0;
d[0]:=1;
for i:=1 to n do
for j:=s downto a[i] do
begin
if (d[j]=0) and (d[j -a[i]]=1) then
d[j]:=1;
if d[s]<>0 then begin ok:=true;exit;end;
end;
end;
procedure
xu_li;
63
begin
s:=tong div 2 ;
while not ok do process;
end;
procedure
inkq;
begin
assign(f,fo);
rewrite(f);
if n<>1 then
write(f,(s+1)*(tong-s-1))
else writeln(f,'0');
close(f);
end;
BEGIN
init;
if n<>1 then xu_li;
inkq;
END.
MUABAN.OUT
MUABAN.INP
MUABAN.OUT
6 10 30
4 3 30
5 7 6 11 2 26
1 2 3 4 5
6 11 2 26
1 2 3 5 6 7
10 20 30
8 9 10
* Chng trnh ci t:
program
mua_ban_hang;
uses crt;
const fi='muaban.inp';
fo='muaban.out';
max=100;
maxs=10000000;
type arrA=array[1..max]of longint;
arrB=array[0..maxs]of longint;
var
f:text;
a,b:arrA;
d:arrB;
n,m,w,tong,luu1,luu2,s,v:longint;
ok1,ok2,ok:boolean;
65
truoc1,truoc2:arrA;
procedure
init;
var i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n,m,w);
tong:=0;
for i:=1 to n do
begin
read(f,a[i]);
tong:=tong+a[i];
end;
readln(f);
for i:=1 to m do
read(f,b[i]);
close(f);
end;
procedure
var
process1;
i,j:longint;
begin
for i:=1 to s do
begin
d[i]:=0;
truoc1[i]:=0;
end;
66
d[0]:=1;
for i:=1 to n do
for j:=s downto a[i] do
begin
if (d[j]=0) and (d[j -a[i]]=1) then
begin
d[j]:=1;
truoc1[j]:=i;
end;
if d[s]<>0 then begin ok1:=true;exit;end;
end;
end;
procedure
var
process2;
i,j:longint;
begin
d[0]:=1;
for i:=1 to v do
begin
d[i]:=0;
truoc2[i]:=0;
end;
for i:=1 to m do
for j:=v downto b[i] do
begin
if (d[j]=0) and (d[j -b[i]]=1) then
begin
67
d[j]:=1;
truoc2[j]:=i;
end;
if d[v]<>0 then begin ok2:=true; exit;end;
end;
end;
procedure
xu_li;
begin
ok:=false;
for s:=w to tong do
begin
ok1:=false;
process1;
if ok1 then
begin
ok2:=false;
v:=s-w;
if v=0 then ok2:=true
else
process2;
end;
if ok1 and ok2 then
begin
luu1:=s;
luu2:=v;
ok:=true;
68
break;
end;
end;
end;
procedure
inkq;
var i:longint;
begin
assign(f,fo);
rewrite(f);
if ok then
begin
writeln(f,'1');
i:=truoc1[luu1];
while luu1<>a[i] do
begin
write(f,i,' ');
luu1:=luu1-a[i];
i:=truoc1[luu1];
end;
writeln(f,i);
if luu2<>0 then
begin
i:=truoc2[luu2];
while luu2<>b[i] do
begin
write(f,i,' ');
69
luu2:=luu2-b[i];
i:=truoc2[luu2];
end;
write(f,i);
end;
end
else writeln(f,'0');
close(f);
end;
BEGIN
init;
xu_li;
inkq;
END.
EMPLOY.OUT
265
456
10 10 11
10 9 11
* Hng dn:
bi ny hi rc ri kh hiu mt cht v vy cn phi c k, nm
chc. R rng vic thu thm hay sa thi cng nhn u phi chu ph tn nn
thy: m bo chi ph t nht cho vic thu nhn cng trong c d n th s
cng nhn ang thu trong mt thng khng nht thit phi l s cng nhn ti
thiu cn cho thng y. V d, ph tn thu cng nh sa thi cng nhn rt
ln th khng di g ta li thng xuyn thu ri li sa thi ngi trong tng
thng, tt nht nn gi hv tr lng (d h khng lm g). Nhim v ca
chng ta trong mi thng phi quyt nh c bao nhiu cng nhn trong bin
ch thu, ngha l phi quyt nh xem cn thu hay cn sa thi bao nhiu cng
nhn trong bin ch ca thng trc. Nu gi T_max l s cng nhn ca thng
cn nhiu ngi nht th r rng s cng nhn trong bin ch thu ca mt
thng bt k trong d n khng bao gi vt qu T_max. Xt mt thng no ,
71
72
5 6
2 2 2 3 3
M t trn hnh v: (S ghi trong hnh vung cho bit kch thc ca hnh
vung )
2
*Hng dn:
2
3
2
3
Tri li
t1 := min{F[k,j] + F[i-k, j]} vi k = 1,2, , i div 2;
t2 := min{F[i,k] + F[i, j-k]} vi k = 1,2, , j div 2;
F[i,j] := min{t1, t2}
*Chng trnh ci t:
program cut_hcn;
const fi='cut.inp';
fo='cut.out';
maxn=1001;
var
f:text;
m,n,t:integer;
q:array[1..maxn,1..maxn] of integer;
procedure
var
nhap;
i,j:integer;
begin
assign(f,fi);
reset(f);
readln(f,m,n);
for i:=1 to m do
for j:=1 to n do
q[i,j]:=-1;
close(f);
end;
procedure
xuli;
var min,l,k,i,j:integer ;
begin
74
timkq(i,j:integer);
var k,l,tg:integer;
begin
if (i mod j =0) or (j mod i =0) then
begin
if i>=j then for tg:=1 to i div j do write(f,j,' ')
else for tg:=1 to j div i do write(f,i,' ');
end
else
begin
for k:=1 to (j div 2) do
if q[i,j]=(q[i,k]+q[i,j -k]) then
begin
timkq(i,k);
timkq(i,j-k);
exit;
end ;
for l:=1 to (i div 2) do
if q[i,j]=(q[l,j]+q[i-l,j]) then
begin
76
timkq(l,j);
timkq(i-l,j);
exit;
end;
end;
end;
procedure
xuat;
var j,i:integer;
begin
assign(f,fo);
rewrite(f);
writeln(f,q[m,n]);
timkq(m,n);
close(f)
end;
BEGIN
nhap;
xuli;
xuat;
END.
Rate.out
17
4 9 2 4 1 3 7
fo='ratethis.out';
maxn=1000000;
var
f:text;
n,kq,dem:int64;
a,fl,fc,ds:array[1..maxn] of int64;
luuc,luul:array[1..maxn] of integer;
procedure
var
nhap;
i:longint;
begin
assign(f,fi);
reset(f);
readln(f,n);
for i:=1 to n do
read(f,a[i]) ;
close(f);
dem:=0;
fillchar(luul,sizeof(luul),0);
fillchar(luuc,sizeof(luuc),0);
end;
function
max2so(cl,j,x,y:int64):int64;
begin
end;
procedure
xuli;
var i,chanle:longint;
begin
fl[1]:=a[1];
fc[1]:=0;
for i:=2 to n do
begin
fl[i]:=max2so(1,i,fl[i -1],fc[i-1]+a[i]);
fc[i]:=max2so(0,i,fc[i -1],fl[i-1]-a[i]);
end;
if fl[n]>fc[n] then begin kq:=fl[n];chanle:=1;end
else begin kq:=fc[n];chanle:=0;end;
for i:=n downto 1 do
begin
if (chanle=1) and (luul[i]=1) then
begin
inc(dem);
ds[dem]:=i;
chanle:=0;
continue;
end;
80
end;
procedure
xuat;
var i:longint;
begin
assign(f,fo);
rewrite(f);
writeln(f,kq);
for i:=dem downto 1 do
write(f,ds[i],' ');
close(f)
end;
BEGIN
nhap;
xuli;
xuat;
END.
81
FOOD.OUT
45
1 1
2 1
2 2
2 3
82
3 3
*Hng dn:
Trng s y l lng thc n trn mi .
Quy tc i:
Bi 20: Sa mc
Mt bi sa mc c dng hnh ch nht MxN. Mi vung n v trn sa
mc c mt cao no . Mt ngi mun i t b u ny sang bcui
cng bn kia. Ngi ch c th i t ang ng ti mt mi theo hng
thng ng cho tri hoc cho phi. Gi thit rng ngi khng c
vt ra hai mp tri v phi ca sa mc.
Hytm ng i sao cho ngi phi vt qua qung ng ngn
nht. Mi ln i t mt sang mi tip theo ngi phi i ht qung
ng bng chnh cao gia hai .
83
SAMAC.INP
SAMAC.OUT
12(Qung ng Min)
(1,3)(2,4) (3,3) (4,2) (5,2)
*Hng dn:
Trng s l chnh cao gia hai lin tip.
Quy tc i.
Cng thc ti u:
B[i,j] l qung ng nh nht i t b u tin n (i,j).
B[1,j]= 0 vi j = 1..N
B[i,1]= Min { B[i-1,1] + abs(A[i,1] - A[i-1,1]), B[i-1,2]+ abs(A[i,1] - A[i-1,2])}
Vi i = 2..M
B[i,j]= Min { B[i-1,j -1] + abs(A[i,j] - A[i-1,j -1]),B[i-1,j] + abs(A[i,j] - A[i-1,j]),
B[i-1,j+1] + abs(A[i,j] - A[i-1,j+1])} Vi i = 2..M, j = 2..N-1
B[i,N] = Min { B[i-1,N] + abs(A[i,N] - A[i-1,N]), B[i-1,N-1]+ abs(A[i,N] - A[i1,N-1])}, Vi i = 2..M.
84
Dng hai im xut pht v qu trnh mua hng. M i ngn cha i qua
c biu din theo dng (x,y) trong (x,y) l v tr ca ngn cha.
V d:
SHOP.INP
SHOP.OUT
80 (Lng hng mua c Max)
(1,3) (1,2) (2,2) (2,1) (3,1) (3,2) (3,3) (3,4) (4,4)
*Hng dn:
Trng s y l s lng hng ti cc ngn cha. ng thi khi tho
mn iu kin khuyn mi th trng s s c tng thms lng bng s
cc con s may mn (ph thuc vo ng trc).
Quy tc i:
:
Cng thc quy hoch ng:
B[i,j] l lng hng max khi i t tng 1 cho n ngn cha (i,j)
B[0,j]= 0 vi j =1..N
B[i,0]= 0 vi i =1..M
86
=1..M
=1..(N-1)
=(j+1)..M
j+1..k
vi
j..(u-1)
cc
con
may
mn.
B[i,N]= Max{B[i,N-1]+KM1,B[i-1,N]+KM2}+A[i,N]
Vi i =1..M
KM1 l lng hng khuyn mi nu abs(A[i,N]-A[i,N-1]) l con s may
mn.
KM2 l lng hng khuyn mi nu abs(A[i,N]-A[i-1,N]) l con s may mn.
Nhn xt:
Cn rt nhiu bi ton khc c dng nh mt trong cc bi ton c bn
ny nhng chung quy li chng ta u c th a n v mt dng chung. Sau
da vo nhng nguyn tc gii chung, ta u c th gii quyt d dng.
Cc dng bi ton tng qut ny khi d liu cho qu gii hn khai bo bng hai
chiu u c th gii quyt bng cch quy hoch lin tc trn 2mng mt
chiu. Sau mi bc quy hoch phi thay i 2 mng ny saocho ph hp vi
bc quy hoch tip theo. Ci kh ca bi ton c d liu ln ny l vic lu
tr trng thi sau khi quy hoch ton b ta cn c th in ra file kt qu qu
trnh i ca phng n ti u.
87
Chng IV. Mt
s t gii
MNHOM.OUT
8 2 1 3 9 10 11
1 4
2 5
3 6
7
88
DOMINO.OUT
1 2
1 6
3 5
2 6
6 4
BALO.OUT
9 100
965
60 7
5 10
8 45
9 3
50 15
9 7
7 68
130 57
1 3
70 123
10 95
Bi 27: i tin
t nc Omega ngi ta ch tiu tin xu. C N loi tin xu, loi th i
c mnh gi l a i ng. Mt ngi khch du lch n Omega du lch vi s tin
M ng. ng ta mun i s tin ra tin xu Omega tin tiu dng. ng ta
cng mun s ng tin i c l t nht (cho ti tin nng khi i y i
). Bn hy gip ng ta tm cch i tin.
D liu: vo trong file vn bn Money.inp c dng:
-
Money.out
4 10
1 2 3 4
Money.inp
Money.out
5 10
2 4 6 8 9
Bi 28:Chia tp
Xt tp cha cc s nguyn t 1 ti N vi N = 4K 1 hoc N = 4K. Tp cc
s nguyn ny c th chia thnh hai tp con c tng cc phn t bng nhau. V
d, vi N = 7, ta c 4 cch chia tho mn iu kin trn:
{2,3,4,5} v {1,6,7}
{1,3,4,6} v {2,5,7}
{1,2,5,6} v {3,4,7}
{1,2,4,7} v {3,5,6}
Vi N cho trc, hy tnh s cch chia thnh 2 tp con c tng cc phn
t bng nhau.
D liu: Vo t file vn bn SET.INP, mi dng cha mt s nguyn N (N
<= 100);
Kt qu: a ra file vn bn SET.OUT s cch chia, mi dng ng vi 1
dng ca file d liu vo
V d:
SET.INP
SET.OUT
4
92
11
35
Bi 29: i tin xu
Nc Silverland s dng h thng tin xu, trong cc xu c mnh gi l
mt s chnh phng: 1,4,9,,289(=17 2). Vi h thng ny, tr 10 xu ta c
4 cch:
Tr 10 ng 1 xu,
Tr 1 ng 4 xu v 6 ng 1 xu,
Tr 2 ng 4 xu v 2 ng 1 xu,
Tr 1 ng 9 xu v 1 ng 1 xu.
Nhim v ca bn l xc nh xem c bao nhiu cch tr mt s tin cho
trc nc Silverland.
D liu vo: Vo t file vn bn COIN.INP
Gm nhiu dng, mi dng mt s nguyn dng khng vt qu 800.
Kt qu ra: a ra file vn bn COIN.OUT l s cch tr ng vi tng
trng hp.
V d:
COIN.INP
2
10
30
COIN.OUT
1
4
27
27
27
2793
MC LC
I.1. T tng ca phng php quy hoch ng.........................................................................3
I.1.1. Thut ton chia tr ......................................................................................................3
I.1.2. H thc truy hi ..............................................................................................................4
I.1.3. Lp trnh ng l g?.......................................................................................................5
I.1.4. Phng php quy hoch ng ........................................................................................ 7
I.2. Cc bc thc hin gii bi ton bng phng php quy hoch ng .................................8
I.2.1. Cc bc c bn: ............................................................................................................8
I.2.2. T chc ci t: ..............................................................................................................9
I.2.3 Khi no dng phng php quy ho ch ng? .................................................................9
Bi 1: Tm dy con khng gi m nhiu phn t nht; ............................................................. 10
Hng dn: ......................................................................................................................... 10
* Chng trnh ci t:.......................................................................................................11
Bi 2: Dy con chung di nh t;.............................................................................................. 13
V d: ..................................................................................................................................14
*Hng dn: ....................................................................................................................... 14
*Chng trnh ci t:........................................................................................................15
Bi 3: Dy con c tng bng S .............................................................................................. 17
Bi 4: Xp vt vo ba l (mi vt ch c 1) .................................................................20
*Hng dn ........................................................................................................................ 21
*Chng trnh ci t:........................................................................................................22
Chng III: Bi tp chn lc .....................................................................................................26
Bi 5: B tr phng hp; ........................................................................................................26
* Hng dn: ...................................................................................................................... 27
* Chng trnh ci t:.......................................................................................................27
Bi 6: Cho thu my tnh; ......................................................................................................30
*Hng dn: ....................................................................................................................... 31
* Chng trnh ci t:.......................................................................................................31
Bi 7: Ni im ...................................................................................................................... 34
*Hng dn: ....................................................................................................................... 35
* Chng trnh ci t:.......................................................................................................35
Bi 8: Dy con i chiu, i du di nht;...........................................................................38
* Hng dn: ...................................................................................................................... 39
* Chng trnh ci t:.......................................................................................................39
Bi 9: S php bin i t nht ............................................................................................... 43
* Hng dn: ...................................................................................................................... 43
*Chng trnh ci t:........................................................................................................44
Bi 10: Xu i xng; ...........................................................................................................47
*Hng dn: ....................................................................................................................... 47
*Chng trnh ci t:........................................................................................................47
Bi 11: Bi ton chia ko .......................................................................................................50
94
95
96