MT S BÀI TOÁN QUY HOCH ĐỘNG ĐIN HÌNH.
I. Dãy con đơn điu dài nht
1. Mô hình
Cho dãy a1,a2,..an. Hãy tìm một dãy con tăng có nhiều phn t nht ca dãy.
Đặc trưng: i) Các phn t trong dãy kết qu ch xut hin 1 ln. Vì vậy phương pháp làm là
ta s dùng vòng For duyt qua các phn t aitrong dãy, khác vi các bài toán ca mô hình
4(đặc trưng là bài toán đổi tin), các phn t trong dãy có th được chn nhiu ln nên ta thc
hin bằng phương pháp cho giá trị cần quy đổi tăng dần từng đơn vị.
ii) Th t ca các phn t đưc chn phải được gi nguyên so với dãy ban đu.
Đặc trưng này có thể mất đi trong một s bài toán khác tùy vào yêu cu c th. Chng hn bài
Tam giác bao nhau.
2. Công thức QHĐ
Hàm mục tiêu : f = độ dài dãy con.
Vì độ dài dãy con ch ph thuc vào 1 yếu t là dãy ban đầu nên bảng phương án là bảng mt
chiu. Gi L(i) là độ dài dãy con tăng dài nhất, các phn t ly trong min t a1 đến ai
phn t cui cùng là ai.
Nhn xét với cách làm này ta đã chia 1 bài toán lớn (dãy con ca n s) thành các bài toán con
cùng kiểu có kích thước nh hơn (dãy con của dãy i s). Vấn đề là công thc truy hồi để phi
hp kết qu ca các bài toán con.
Ta có công thức QHĐ để tính L(i) như sau:
L(1) = 1. (Hin nhiên)
L(i) = max(1, L(j)+1 vi mi phn t j: 0<j<i và aj≤ai).
Tính L(i) : phn t đang được xét là ai .Ta tìm đến phn t aj <ai có L(j) ln nhất. Khi đó nếu
b sung ai vào sau dãy con ...aj ta s được dãy con tăng dần dài nht xét t a1...ai.
3. Cài đặt
Bảng phương án là một mng mt chiều L để lưu trữ các giá tr của hàm QHĐ L(i). Đoạn
chương trình tính các giá trị ca mảng L như sau:
for i := 1 to n do begin
L[i] := 1;
for j:=1 to i1 do
if (a[j]<=a[i]) and (L[i]<L[j]+1) then
L[i]:=L[j]+1;
end;
Như vậy chi phí không gian ca bài toán là O(n), chi phí thi gian là O(n2). Có một phương
pháp cài đặt tốt hơn so với phương pháp trên, cho chi phí thời gian là O(nlogn
4. Mt s bài toán khác
Bài toán dãy con đơn điệu tăng dài nhất có biến th đơn giản nhất là bài toán dãy con đơn
điệu gim dài nht, tuy nhiên chúng ta có th coi chúng như là một. Sau đây là một s bài toán
khác.
a) B trí phòng hp( mt tính th t so vi dãy ban đầu)
Có n cuc hp, cuc hp th i bắt đầu vào thời điểm ai và kết thúc thời điểm bi. Do ch
mt phòng hi tho nên 2 cuc hp bt kì s được cùng b trí phc v nếu khong thi gian
làm vic ca chúng ch giao nhau tại đầu mút. Hãy b trí phòng họp để phc v được nhiu
cuc hp nht.
ng dn: Sp xếp các cuc họp tăng dần theo thời điểm kết thúc (bi). Thế thì cuc hp i s
b trí được sau cuc hp j nếu và ch nếu j<i và bj<=ai. Yêu cu b trí được nhiu cuc hp
nht có th đưa về vic tìm dãy các cuc hp dài nht tho mãn điều kin trên.
b) Cho thuê máy
Trung tâm tính toán hiệu năng cao nhận được đơn đặt hàng ca n khách hàng. Khách hàng i
mun s dng máy trong khong thi gian t ai đến bi và tr tin thuê là ci. Hãy b trí lch
thuê máy để tng s tiền thu được là ln nht mà thi gian s dng máy ca 2 khách hàng bt
kì được phc v đều không giao nhau (c trung tâm ch có mt máy cho thuê).
ng dn: Tương tự như bài toán a), nếu sp xếp các đơn đặt hàng theo thời điểm kết thúc,
ta s đưa được bài toán b) v bài toán tìm dãy con có tng ln nht. Bài toán này là biến th
ca bài toán tìm dãy con tăng dài nhất, ta có th cài đặt bằng đoạn chương trình như sau:
for i:=1 to n do begin
L[i]:=c[i];
for j:=1 to i1 do
if (b[j]<=a[i]) and (L[i]<L[j]+c[i]) then
L[i]:=L[j]+c[i];
end;
c) Dãy tam giác bao nhau
Cho n tam giác trên mt phng. Tam giác i bao tam giác j nếu 3 đỉnh của tam giác j đều nm
trong tam giác i (có th nm trên cnh). Hãy tìm dãy tam giác bao nhau có nhiu tam giác
nht.
ng dn: Sp xếp các tam giác tăng dần v diện tích. Khi đó tam giác i sẽ bao tam giác j
nếu j<i và 3 đỉnh ca j nm trong i. T đó có thể đưa về bài toán tìm dãy “tăng” dài nhất.
Trang 2
Vic kiểm tra điểm M có nm trong tam giác ABC không có th dựa trên phương pháp tính
diện tích: điểm M nm trong nếu S(ABC) = S(ABM) + S(ACM) + S(BCM).
Bài toán có mt s biến th khác như tìm dãy hình tam giác, hình chữ nhật… bao nhau có
tng din tích ln nht.
d) Dãy đổi du
Cho dãy a1, a2,…an. Hãy dãy con đổi du dài nht ca dãy đó. Dãy con con đổi du
ai1,ai2,…aik phi tho mãn các điều kin sau:
ai1<ai2>ai3<… hoặc ai1>ai2<ai3>…
các ch s phi cách nhau ít nht L: i2i1≥L, i3i2≥L….
chênh lch gia 2 phn t liên tiếp nh hơn U: |ai1ai2|≤U, |ai2ai3|≤U…
ng dn: Gi L(i) là s phn t của dãy con đổi du có phn t cui cùng là ai và phn t
cui cùng lớn hơn phn t đứng trước. Tương tự, P(i) là s phn t của dãy con đổi du có
phn t cui cùng là ai và phn t cui cùng nh hơn phn t đứng trước.
Ta d dàng 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.
f) Dãy s WAVIO:
Dãy s Wavio là dãy s nguyên tha mãn các tính cht : các phn t đầu sp xếp thành 1 dãy
tăng dần đến 1 phn t đỉnh sau đó giảm dn. Ví d dãy s 1 2 3 4 5 2 1 là 1 dãy Wavio độ
dài 7. Cho 1 dãy gm N s nguyên, hãy ch ra một dãy con Wavio có đọ dài ln nht trích ra
t dãy đó.
ng dn: L1[i] là mảng ghi độ dài ln nht của 1 dãy con tăng dần trích ra ty N phn
t k t phn t 1 đến phn t ai. L2[i] : mảng ghi độ dài ln nht ca dãy con gim dn trích
ra t dãy N phn t k t phn t aN đến ai. Ta tìm phn t j trong 2 mng L1, L2 tha mãn
L1[j]+L2[j] ln nht.
g) Tháp Babilon ( Tính cht duy nht ca các phn t trong phương án tối ưu bị vi phm)
h) Xếp các khi đá :
Cho N khối đá (N≤5000) Các khối đá đều có dng hình hp ch nhật và được đặc trưng bới 3
kích thước: dài, rng, cao. Mt cách xây dng tháp là một cách đặt mt s các khối đá trong
các khối đá đã cho chồng lên nhau theo quy tc:
Chiu cao mi khối đá là kích thước nh nhất trong 3 kích thước.
Các mép ca khối đá được đặt song song vi nhau sao cho không có phn nào ca khi
trên nm chìa ra ngoài khối dưới.
a) Hãy ch ra cách để xây dựng được mt cái tháp sao cho s khối đá được dùng là nhiu
nht.
b) Hãy ch ra cách để xây dựng được mt cái tháp sao cho chiu cao ca cái tháp là cao nht
D liu vào TOWER.INP có cấu trúc như sau :
Dòng đầu là s N.
N dòng sau dòng i ghi 3 s nguyên ≤ 255 là 3 kích thước ca khối đá i .
D liu ra : TOWER1.OUT, TOWER2.OUT ghi theo quy cách :
Dòng đầu ghi s các khối đá được chn theo th t dùng để xây tháp t chân lên đỉnh.
Trang 3
Các dòng sau ghi các khối được chn, mi khối đá ghi 4 số T, D, R, C trong đó T là số th
t ca mi khối đá. D, R, C là kích thước ca khối đá tương ứng.
II. Vali (B)
1. Mô hình
Có n đồ vt, vt th i có trọng lượng a[i] và giá tr b[i]. Hãy chn ra mt s các đồ vt, mi
vt một cái để xếp vào 1 vali có trọng lượng tối đa W sao cho tổng giá tr ca vali là ln nht.
2. Công thc
Hàm mc tiêu : f: tng giá tr ca vali.
Nhn xét : giá tr ca vali ph thuc vào 2 yếu t: có bao nhiêu vật đang được xét và trng
ng ca các vật. Do đó bảng phương án sẽ là bng 2 chiu.
L[i,j] : tng giá tr ln nht ca vali khi xét t vt 1..vt i và trọng lượng của vali chưa vượt
quá j. Chú ý rằng khi xét đến L[i,j] thì các giá tr trên bảng phương án đều đã được tối ưu.
Tính L[i,j] : vật đang xét là ai vi trọng lượng của vali không được quá j. Có 2 kh năng
xy ra :
Nếu chn aiđưa vào vali, trọng lượng vali trước đó phải ≤ j-a[i]. Vì mi vt ch được
chn 1 ln nên giá tr ln nht của vali lúc đó là L[i-1,j-a[i]) + b[i]
Nếu không chn ai , trọng lượng của vali là như cũ (như lúc trước khi chn ai ): L[i-1,j].
Tóm li ta có L[i,j]=max(L(i-1,j-a[i]) + b[i], L[i-1,j]).
3. Cài đặt
For i:=1 to n do
For j:=1 to W do
If b[i]<=j then
L[i,j]:=max(L(i-1,j-a[i]) + b[i], L[i-1,j])
else L[i,j]:=L[i-1,j];
4. Mt s bài toán khác
a) Dãy con có tng bng S:
Cho dãy a1,a2,..an. Tìm mt dãy con của dãy đó có tng bng S.
ng dn
Đặt L[i,t)=1 nếu th to ra tng t t mt dãy con ca dãy gm các phn t a1,a2,..ai. Ngược
li thì L[i,t)=0. Nếu L[n,S)=1 thì đáp án của bài toán trên là “có”.
Ta có th tính L[i,t] theo công thc: L[i,t]=1 nếu L[i1,t]=1 hoc L[i1,ta[i]]=1.
Cài đặt
Nếu áp dng luôn công thc trên thì ta cn dùng bảng phương án hai chiều. Ta có th nhn
xét rằng để tính dòng th i, ta ch cn dòng i1. Bảng phương án khi đó chỉ cn 1 mng 1
chiều L[0..S] và được tính như sau:
L[t]:=0; L[0]:=1;
for i := 1 to n do
for t := S downto a[i] do
if (L[t]=0) and (L[ta[i]]=1) then L[t]:=1;
Trang 4
D thy chi phí không gian của cách cài đặt trên là O(m), chi phí thi gian là O(nm), vi m là
tng ca n s. Hãy t kim tra xem ti sao vòng for th 2 li là for downto ch không phi là
for to.
b) Chia ko
Cho n gói ko, gói th i có ai viên. Hãy chia các gói thành 2 phn sao cho chênh lch gia 2
phn là ít nht.
ng dn: Gi T là tng s ko ca n gói. Chúng ta cn tìm s S ln nht tho mãn:
S≤T/2.
Có mt dãy con ca dãy a có tng bng S.
Khi đó sẽ có cách chia vi chênh lch 2 phn là T2S là nh nht và dãy con có tng bng S
trên gm các phn t là các gói ko thuc phn th nht. Phn th hai là các gói ko còn li.
c) Market (Olympic Balkan 2000)
Người đánh cá Clement bắt được n con cá, khối lượng mi con là ai, đem bán ngoài chợ.
ch cá, người ta không mua cá theo tng con mà mua theo mt ng nào đó. Chẳng hn 3
kg, 5kg…
Ví d: có 3 con cá, khối lượng lần lượt là: 3, 2, 4. Mua lượng 6 kg s phi ly con cá th 2 và
và th 3. Mua lượng 3 kg thì ly con th nht. Không th mua lượng 8 kg.
Nếu bạn là người đầu tiên mua cá, có bao nhiêu lượng bn có th chn?
ng dn: Thc cht bài toán là tìm các s S mà có mt dãy con ca dãy a có tng bng S.
Ta có th dùng phương pháp đánh dấu ca bài chia ko trên rồi đếm các giá tr t mà L[t]=1.
d) Đin du
Cho n s t nhiên a1,a2, ...,an. Ban đầu các s được đt liên tiếp theo đúng thứ t cách nhau
bi du "?": a1?a2?...?an. Cho trước s nguyên S, có cách nào thay các du "?" bng du + hay
dấu − để được mt biu thc s hc cho giá tr là S không?
ng dn: Đặt L(i,t)=1 nếu có th đin du vào i s đầu tiên và cho kết qu bng t. Ta có
công thức sau để tính L:
L(1,a[1]) =1.
L(i,t)=1 nếu L(i1,t+a[i])=1 hoc L(i1,ta[i])=1.
Nếu L(n,S)=1 thì câu tr li của bài toán là có. Khi cài đặt, có th dùng mt mng 2 chiều (lưu
toàn b bảng phương án) hoặc 2 mng mt chiều (để lưu dòng i và dòng i–1). Chú ý là ch s
theo t ca các mng phi có c phn âm (tc là t T đến T, vi T là tng ca n s), vì trong
bài này chúng ta dùng c du nên có th to ra các tng âm.
Bài này có mt biến thđặt du sao cho kết qu là mt s chia hết cho k. Ta có thut gii
tương tự bài toán trên bng cách thay các phép cng, tr bng các phép cng và tr theo
môđun k và dùng mảng đánh dấu vi các giá tr t 0 đến k1 (là các s dư có thể có khi chia
cho k). Đáp số ca bài toán là L(n,0).
e) Expression (ACM 10690)
Cho n s nguyên. Hãy chia chúng thành 2 nhóm sao cho tích ca tng 2 nhóm là ln nht.
Trang 5