Một số bài toán quy hoạch động điển hình

MT SBÀI TOÁN QUY HOCH ĐỘNG ĐIỂN HÌNH.  
I. Dãy con đơn điệu 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 tnht ca dãy.  
Đặc trưng: i) Các phn ttrong dãy kết quchxut hin 1 ln. Vì vậy phương pháp làm là  
ta sdùng vòng For duyt qua các phn taitrong 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 ttrong 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) Thtca các phn tử được chn phải được ginguyên so với dãy ban đầu.  
Đặc trưng này có thể mất đi trong một sbài toán khác tùy vào yêu cu cth. 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 chphthuc 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 tly trong min ta1  
phn tcui cùng là ai.  
đến ai và  
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 quca 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 tj: 0<j<i và aj≤ai).  
Tính L(i) : phn tử đang đưc xét là ai .Ta tìm đến phn taj <ai có L(j) ln nhất. Khi đó nếu  
bsung ai vào sau dãy con ...aj ta sẽ được dãy con tăng dần dài nht xét ta1...ai.  
3. Cài đặt  
Bảng phương án là một mng mt chiều L để lưu trữ các giá trcủa hàm QHĐ L(i). Đon  
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;  
2
Như vậy chi phí không gian ca bài toán là O(n), chi phí thi gian là O(n ). 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 sbà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 sbài toán  
khác.  
a) Btrí phòng hp( mt tính thtso vi dãy ban đầu)  
Có n cuc hp, cuc hp thi bắt đầu vào thời điểm ai và kết thúc thời điểm bi. Do chcó  
mt phòng hi tho nên 2 cuc hp bt kì sẽ đưc cùng btrí phc vnếu khong thi gian  
làm vic ca chúng chgiao nhau tại đầu mút. Hãy btrí phòng họp để phc vụ được nhiu  
cuc hp nht.  
Hướ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à chnếu j<i và bj<=ai. Yêu cu bố trí đưc nhiu cuc hp  
nht có thể đưa vvic 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 sdng máy trong khong thi gian tai đến bi và trtin thuê là ci. Hãy btrí lch  
thuê máy đtng stiền thu được là ln nht mà thi gian sdng máy ca 2 khách hàng bt  
kì được phc vụ đều không giao nhau (ctrung tâm chcó mt máy cho thuê).  
Hướ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) vbà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ó thnm trên cnh). Hãy tìm dãy tam giác bao nhau có nhiu tam giác  
nht.  
Hướng dn: Sp xếp các tam giác tăng dn vdiệ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 đim M có nm trong tam giác ABC không có thdự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 sbiế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 chsphi cách nhau ít nht L: i2i1≥L, i3i2≥L….  
chênh lch gia 2 phn tliên tiếp nhỏ hơn U: |ai1ai2|≤U, |ai2ai3|≤U…  
Hướng dn: Gi L(i) là sphn tcủa dãy con đổi du có phn tcui 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à sphn tcủa dãy con đổi du có  
phn tcui cùng là ai và phn tcui cùng nhỏ hơn phn tử đứng trước.  
Ta ddà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≤iL và ai<aj≤ai+U.  
f) Dãy sWAVIO:  
Dãy sWavio là dãy snguyê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 đó gim dn. Ví ddãy s1 2 3 4 5 2 1 là 1 dãy Wavio độ  
dài 7. Cho 1 dãy gm N snguyên, hãy chra một dãy con Wavio có đọ dài ln nht trích ra  
từ dãy đó.  
Hướ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 tdãy N phn  
tktphn tử 1 đến phn tai. L2[i] : mảng ghi độ dài ln nht ca dãy con gim dn trích  
ra tdãy N phn tktphn taN đến ai. Ta tìm phn tj 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 chnhật và được đặc trưng bi 3  
kích thước: dài, rng, cao. Mt cách xây dng tháp là một cách đặt mt scá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 nhnhấ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 skhố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  
Dliu vào TOWER.INP có cấu trúc như sau :  
Dòng đầu là sN.  
N dòng sau dòng i ghi 3 số nguyên ≤ 255 là 3 kích thưc ca khối đá i .  
Dliu ra : TOWER1.OUT, TOWER2.OUT ghi theo quy cách :  
Dòng đầu ghi scác khối đá được chn theo thtự 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ứ  
tca 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 thi có trọng lượng a[i] và giá trb[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á trca vali là ln nht.  
2. Công thc  
Hàm mc tiêu : f: tng giá trca vali.  
Nhn xét : giá trca vali phthuc vào 2 yếu t: có bao nhiêu vật đang được xét và trng  
lượng ca các vật. Do đó bảng phương án sbng 2 chiu.  
L[i,j] : tng giá trln nht ca vali khi xét tvt 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á trtrê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á trln 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 sbà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.  
Hướng dn  
Đặt L[i,t)=1 nếu có thto ra tng t tmt dãy con ca dãy gm các phn ta1,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ó thtí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ó thnhn  
xét rằng để tính dòng thi, ta chcn 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  
Dthy 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 tkim tra xem ti sao vòng for th2 li là for downto chkhông phi là  
for to.  
b) Chia ko  
Cho n gói ko, gói thi 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.  
Hướng dn: Gi T là tng sko ca n gói. Chúng ta cn tìm sS ln nht thomã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à nhnht và dãy con có tng bng S  
trên gm các phn tlà các gói ko thuc phn thnht. Phn thhai 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 lượng nào đó. Chẳng hn 3  
kg, 5kg…  
d: có 3 con cá, khối lượng lần lượt là: 3, 2, 4. Mua lượng 6 kg sphi ly con cá th2 và  
và thứ 3. Mua lượng 3 kg thì ly con thnht. 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ó thchn?  
Hướng dn: Thc cht bài toán là tìm các sS 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á trt mà L[t]=1.  
d) Điền du  
Cho n stnhiên a1,a2, ...,an. Ban đầu các số được đặt liên tiếp theo đúng thtcách nhau  
bi du "?": a1?a2?...?an. Cho trước snguyên S, có cách nào thay các du "?" bng du + hay  
dấu − để đưc mt biu thc shc cho giá trlà S không?  
Hướng dn: Đặt L(i,t)=1 nếu có thể điền du vào i số đầu tiên và cho kết qubng 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 trli của bài toán là có. Khi cài đặt, có thdùng mt mng 2 chiều (lưu  
toàn bbảng phương án) hoặc 2 mng mt chiều (để lưu dòng i và dòng i–1). Chú ý là chsố  
theo t ca các mng phi có cphn â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 cdu nên có thto ra các tng âm.  
Bài này có mt biến thđặt du sao cho kết qulà mt schia 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, trbng các  
phép cng và trtheo  
môđun k và dùng mảng đánh dấu vi các giá trtừ 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 snguyê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  
Hướng dn: Gi T là tng n số nguyên đó. Giả sta chia dãy thành 2 nhóm, gi S là tng ca  
mt nhóm, tng nhóm còn li là TS và tích ca tng 2 nhóm là S*(TS). Bằng phương pháp  
đánh dấu ta xác định được mi sS là tng ca một nhóm (như bài Market) và tìm số S sao  
cho S*(T–S) đạt max.  
III. Biến đổi xâu:  
1. Mô hình  
Cho 2 xâu X,F. Xâu ngun có n kí tX1X2...Xn , xâu đích có m kí tự F1F2...Fm .Có 3 phép  
biến đổi :  
Chèn 1 kí tvào sau kí tthi :I i C  
Thay thế kí tự ở vtrí thi bng kí tC : R i C.  
Xoá kí tự ở vtrí thi. D i  
Hãy tìm sít nht các phép biến đổi để biến xâu X thành xâu F.  
Hướng dn:  
Hàm mc tiêu : f: sphép biến đổi.  
Dthy sphép biến đổi phthuc vào vị trí i đang xét của xâu X và vị trí j đang xét cuả xâu  
F. Do vậy để cài đặt cho bang phương án ta sẽ dùng mng 2 chiu  
Gi L(i,j) là sphép biến đổi ít nht  
để biến xâu X(i) gm i kí tphn  
đầu ca X (X(i)=  
X[1..i]) thành xâu F(j) gm j kí tphn đu ca F(F(j) =F[1..j]). Dthy F(0,j)=j và F(i,0)=i.  
Có 2 trường hp xy ra:  
Nếu X[i]=F[j] :  
X
X1X2...Xi-1  
F1F2...Fj-1  
i
X
i
thì ta chphi biến đổi xâu X(i-1) thành xâu Y(j-1). Do đó F(i,j)=F(i-1,j-1).  
Ngược li, ta có 3 cách biến đổi:  
X
Xoá kí tX[i]:  
X1X2...Xi-1  
i
Fj  
F1F2...Fj-1  
Xâu X(i-1) thành F(j). Khi đó F(i,j)=F(i-1,j)+1.(Cộng 1 là do ta đã dùng 1 phép xóa)  
Fj  
Thay thế X[i] bi F[j] :  
X1X2...Xi-1  
F1F2...Fj-1  
Fj  
Xâu X(i-1) thành F(j-1). Khi đó F(i,j)=F(i-1,j-1)+1.  
Chèn F[j] vào X(i):  
X1X2...Xi-1XiFj  
Fj  
F1F2...Fj-1  
Xâu X(i) thành Y(j-1). Khi đó F(i,j)=F(i,j-1)+1.  
Tng kết li, ta có công thức QHĐ:  
F(0,j)=j  
F(i,0)=i  
Trang 6  
• F(i,j) =F(i−1,j−1) nếu X[i] = Y[j].  
• F(i,j) = min(F(i−1,j),F(i,j−1),F(i−1,j−1))+1 nếu X[i]≠Y[j].  
Bài này ta có thtiết kim biến hơn bằng cách dùng 2 mng 1 chiu tính ln nhau và mt  
mng đánh dấu 2 chiu để truy vết.  
4. Mt sbài toán khác  
a) Xâu con chung dài nht  
Cho 2 xâu X,Y. Hãy tìm xâu con ca X và của Y có độ dài ln nht.  
Công thức QHĐ  
Gi L(i,j) là độ dài xâu con chung dài nht ca xâu X(i) gm i kí tphn đầu ca X (X(i)=  
X[1..i]) và xâu Y(j) gm j kí tphn đu ca Y (Y(j) =Y[1..j]).  
Ta có công thc quy hoạch động như sau:  
L(0,j)=L(i,0)=0.  
• L(i,j) = L(i−1,j−1)+1 nếu X[i] = Y[j].  
• L(i,j) = max(L(i−1,j), L(i,j−1)) nếu X[i]≠Y[j].  
Cài đặt  
Bảng phương án là một mng 2 chiu L[0..m,0..n]  
để lưu các giá trị của hàm QHĐ L(i,j).  
Đoạn chương trình cài đt công thức QHĐ trên như sau:  
for i:=0 to m do L[i,0]:=0;  
for j:=0 to n do L[0,j]:=0;  
for i:=1 to m do  
for j:=1 to n do  
if X[i]=Y[j] then  
L[i,j]:=L[i1,j1]+1  
else  
L[i,j]:=max(L[i1,j],L[i,j1]]);  
2
2
Như vậy chi phí không gian ca bài toán là O(n ), chi phí thi gian là O(n ). Có một phương  
pháp cài đặt tốt hơn, chvi chi phí không gian O(n) da trên nhn xét sau: để tính ô L[i,j]  
ca bảng phương án, ta chỉ cn 3 ô L[i1,j1],L[i1,j] và L[i,j1]. Tức là để tính dòng L[i]  
thì chcn dòng L[i1]. Do đó ta chỉ cn 2 mng 1 chiều để lưu dòng vừa tính (P) và dòng  
đang tính (L) mà thôi. Cách cài đặt mới như sau:  
for j:=0 to n do P[j]:=0;  
for i:=1 to m do begin  
L[0] := 0;  
for j:=1 to n do  
if X[i]=Y[j] then  
L[i,j]:=P[j1]+1  
else L[i,j]:=max(P[j], L[j1]);  
P := L;  
end;  
c) Bc cu  
Hai nước Anpha và Beta nm hai bên bsông Omega, Anpha nm bbc và có M thành  
phố được đánh số từ 1 đến m, Beta nm bnam và có N thành phố được đánh số từ 1 đến n  
(theo vtrí từ đông sang tây). Mỗi thành phcủa nước này thường có quan hkết nghĩa với  
mt sthành phcủa nước kia. Để tăng cường tình hu nghị, hai nước mun xây các cây cu  
bc qua sông, mi cây cu slà nhp cu ni 2 thành phkết nghĩa. Với yêu cu là các cây  
Trang 7  
cầu không được ct nhau và mi thành phchỉ là đầu cu cho nhiu nht là mt cây cu, hãy  
chra cách bc cầu được nhiu cu nht.  
Hướng dn: Gi các thành phca Anpha lần lưt là a1,a2,…am; các thành phca Beta là  
b1,b2,...bn. Nếu thành phai và bj kết nghĩa với nhau thì coi ai bằng” bj. Để các cây cu  
không ct nhau, nếu ta đã chn cp thành ph(ai,bj) để xây cu thì cp tiếp theo phi là cp  
(au,bv) sao cho u>i và v>j. Như vy các cp thành phố được chn xây cu có thcoi là mt  
dãy con chung ca hai dãy a và b.  
Bài toán ca chúng ta trthành bài toán tìm dãy con chung dài nht, ở  
“bằng” nhau nếu chúng có quan hkết nghĩa.  
đây hai phn tử  
d) Palindrom (IOI 2000)  
Mt xâu gọi là xâu đi xng (palindrom) nếu xâu đó đọc ttrái sang phi hay tphi sang  
trái đều như nhau. Cho một xâu S, hãy tìm skí tít nht cần thêm vào S để S trthành xâu  
đi xng.  
Hướng dn: Bài toán này có mt công thức QHĐ như sau:  
Gi L(i,j) là skí tít nht cn thêm vào xâu con S[i..j] ca S để xâu đó trở thành đối xng.  
Đáp số ca bài toán slà L(1,n) vi n là skí tca S. Ta có công thức sau để tính L(i,j):  
L(i,i)=0.  
L(i,j)=L(i+1,j1) nếu S[i]=S[j]  
L(i,j)=max(L(i+1,j), L(i,j1)) nếu S[i]≠S[j]  
Bạn đọc ddàng có thkim chng công thức đó. Ta có thể cài đặt trc tiếp công thức đó  
bằng phương pháp đệ quy có nh. Tuy nhiên khi đó chi phí không gian là O(n2). Có mt  
phương pháp cài đặt tiết kiệm hơn (bạn đọc có ththam kho bài báo trên ca thy Trần Đỗ  
Hùng), tuy nhiên phương pháp đó khá phức tp.  
Ta có thuật toán đơn giản hơn như sau:  
Gi P là xâu đo ca S và T là xâu con chung dài nht của S và P. Khi đó các kí tự ca S  
không thuộc T cũng là các kí tự cần thêm vào để S trở thành đối xứng. Đáp số ca bài toán sẽ  
là nk, với k là độ dài ca T.  
Ví d: S=edbabcd, xâu đảo ca S là P=dcbabde. Xâu con chung dài nht ca S và P là  
T=dbabd. Như vy cn thêm 2 kí te c vào để S trở thành xâu đối xng.  
IV. Vali (A)  
1. Mô hình  
Cho n vt, vt i nng ai và có giá trbi. Hãy chn ra mt svật để cho vào balô sao cho tng  
khối lượng không vượt quá W và tng giá trlà ln nht. Chú ý rng mi vt có thể được chn  
nhiu ln.  
2. Công thc  
Gi L(i,j) là tng giá trln nht khi được chn i vt t1 đến i cho vào balô vi tng khi  
lượng không vượt quá j. L(n,W) sẽ là đáp sca bài toán (là giá trln nhất có được nếu chn  
n vt và tng khối lượng không vượt quá W).  
Công thức tính L(i,t) như sau:  
Trang 8  
L(i,0)=0; L(0,j)=0.  
L(i,j)=L(i,j) nếu t<ai.  
L(i,t)=max(L(i-1,j), L(i,jai)+bi) nếu t ≥ai.  
Trong đó: L(i–1,j) là giá trị có được nếu không đưa vt i vào balô, L(i,jai)+bi là giá trcó  
được nếu chn vt i.  
3. Cài đặt  
Ta có thdùng mt mng 2 chiều để lưu bảng phương án, tuy nhiên dựa trên nhn xét rằng để  
tính dòng i ca bảng phương án chỉ cn dòng i1, ta chcn dùng 2 mng mt chiu P và L có  
chstừ 0 đến m để lưu 2 dòng đó. Đoạn chương trình con tính bảng phương án như sau.  
L[t] := 0; {vi mi t}  
for i := 1 to n do begin  
P:=L;  
for t := 0 to m do  
if t<a[i] then L[t]:=P[t]  
else L[t] := max(P[t],P[ta[i]]);  
end;  
Nếu để ý kĩ bạn sthy rằng đoạn trình trên chviết ging công thức QHĐ chứ chưa tối ưu.  
Chng hạn đã có lệnh gán P:=L, sau đó lại có gán L[t]:=P[t] vi các giá trt<a[i] là không cn  
thiết. Bạn đọc có thtci tiến để chương trình tối ưu hơn.  
Chi phí không gian của cách cài đặt trên là O(m) và chi phí thi gian là O(n.m).  
4. Mt sbài toán khác  
a) Farmer (IOI 2004)  
Một người có N mảnh đất và M dải đất. Các mảnh đất có thcoi là mt tgiác và các dải đất  
thì coi như một đường thng. Dc theo các dải đất ông ta trng các cây bách, dải đất thi có  
ai cây bách. Ông ta cũng trồng các cây bách trên vin ca các mảnh đất, mảnh đất thj có bj  
cây bách. Cả ở trên các mảnh đất và dải đất, xen gia 2 cây bách ông ta trng mt cây ôliu.  
Ông ta cho con trai được chn các mảnh đất và dải đất tuý với điều kin tng scây bách  
không vượt quá Q. Ngưi con trai phi chn thế nào để có nhiu cây ôliu (loài cây mà anh ta  
thích) nht.  
Hướng dn: Dthy mảnh đất thi có ai cây ôliu và dải đất thj có bj1 cây ôliu. Coi các  
mảnh đất và dải đất là các “đồ vật”, đồ vt thk có khối lượng wk và giá trvk (nếu k là mnh  
đất i thì wk=vk=ai, nếu k là dải đất j thì wk=bj, vk=bj1). Ta cn chọn các “đồ vật”, sao cho  
tổng “khối lượng” của chúng không vượt Q và tổng “giá trị” là lớn nhất. Đây chính là bài toán  
xếp balô đã trình bày ở trên.  
b) Đổi tin  
Ở đất nước Omega người ta chtiêu tin xu. Có N loi tin xu, loi thi có mnh giá là ai  
đng. Một người khách du lịch đến Omega du lch vi stiền M đồng. Ông ta muốn đổi số  
tiền đó ra tiền xu Omega để tiện tiêu dùng. Ông ta cũng muốn số đồng tiền đổi được là ít nht  
(cho túi tiền đỡ nặng khi đi đây đi đó). Bạn hãy giúp ông ta tìm cách đổi tin.  
Hướng dn: Bài toán này khá ging bài toán xếp balô (“khối lượng” là mnh giá, “giá trị” là  
1), chcó mt số thay đổi nh: số đồng xu mi loi được chn tuý (trong bài toán xếp balô  
mỗi đồ vt chỉ được chn 1 ln) và tng giá tryêu cu là nhnht.  
Trang 9  
Do đó ta cũng xây dựng hàm QHĐ một cách tương tự: Gi L(i,t) là số đồng xu ít nht nếu đổi  
t đồng ra i loi tin xu (từ 1 đến i). Công thức tính L(i,t) như sau:  
L(i,0)=0;  
• L(0,t)= ∞ với t>0.  
L(i,t)=L(i1,t) nếu t<ai.  
L(i,t)=min(L(i1,t), L(i,tai)+1) nếu t ≥ai.  
Công thc này khác công thc ca bài xếp balô ch: dùng hàm min chkhông phi hàm  
max (vì cn tìm cách chọn ít hơn) và nếu chọn đồng xu thi thì L(i,t)=L(i,tai)+1 (vì ta vn  
còn được chọn đồng xu thứ i đó nữa), khác vi khi xếp balô là: nếu chọn đồ vt thi thì  
L(i,t)=L(i1,tai)+bi vì đồ vt i chỉ được chn mt ln.  
V. Nhân ma trn  
1. Mô hình  
Nhân mt ma trận kích thưc m×n vi mt ma trn n×p, sphép nhân phi thc hin là  
m.n.p. Mt khác phép nhân các ma trn có tính kết hp, tc là:  
(A.B).C = A.(B.C)  
Do đó khi tính tích nhiều ma trn, ta có ththc hin theo các trình tkhác nhau, mi trình tự  
tính squyết định sphép nhân cn thc hin.  
×
Cho N ma trn A1,A2…An, ma trn Ai có kích thước là di1 di. Hãy xác định trình tnhân ma  
trn A1.A2…An sao cho sphép nhân cn thc hin là ít nht.  
2. Công thc  
Gi F(i,j) là sphép nhân để tính tích các ma trn tAiđến Aj (Ai.Ai+1....Aj).  
F(i,i)=0.  
.d .d  
F(i,i+1)=di1 i i+1  
.d .d  
F(i,j) = min(F(i,k)+F(k+1,j)+di1 k  
j
vi k=i+1,i+2,...j1)  
Công thức hơi phức tp nên tôi xin giải thích như sau:  
F(i,i)=0 là hin nhiên.  
×
F(i,i+1) là sphép nhân khi nhân Ai và Ai+1. Ai có kích thước di1 di, Ai+1 có kích thước  
.d .d  
.
di×di+1, do đó F(i,i+1)=di1 i i+1  
Vi j>i+1 thì ta thy có thtính Ai.Ai+1....Aj bng cách chn mt vị trí k nào đó để đặt  
ngoc theo trình t:  
Ai.Ai+1....Aj = (Ai..Ak).(Ak+1..Aj)  
×
Ma trn kết quca phép nhân (Ai..Ak) có kích thước di1 dk, ma trn kết quca phép nhân  
×
(Ak+1..Aj) có kích thước dk dj. Với cách đặt đó ta sẽ mất F(i,k) phép nhân để có kết qutrong  
du ngoc thnht, mất thêm F(k+1,j) phép nhân để có kết qutrong du ngoc thhai, và  
cui cùng mt di1.dk.dj để nhân 2 ma trn kết quả đó. Từ đó tổng sphép nhân của cách đặt  
.d .d .  
đó là: F(i,k)+F(k+1,j)+di1 k j  
Ta chn vtrí k cho sphép nhân ít nht.  
Trang10  
3. Cài đặt  
Bảng phương án là một mng 2 chiều F để lưu F(i,j). Chú ý khi cài đặt là để tính được F(i,j),  
ta phải tính F(i,k) và F(k+1,j) trước. Phương pháp đơn giản để làm điều đó là phương pháp đệ  
quy có nh.  
Tuy nhiên da vào nhn xét là trong công thức QHĐ: ji lớn hơn k–i và jk, ta có thtính  
theo trình tkhác: tính các phn tF(i,j) vi ji tnhỏ đến ln (không phi là tính các giá  
trF(i,j) vi i,j tnhỏ đến lớn như vẫn làm). Với cách đó, khi tính đến F(i,j) thì ta đã có F(i,k)  
và F(k+1,j).  
Đoạn chương trình tính bảng phương án như sau:  
for i:=1 to n do F[i,i]:=0;  
for i:=1 to n1 do  
F[i,i+1] := d[i1]*d[i]*d[i+1];  
for m:=2 to n1 do begin  
for i:=1 to nm do begin  
j:=i+m; F[i,j]:=oo;  
for k:=i+1 to j1 do  
F[i,j]:=min(F[i,j],  
F[i,k]+F[k+1,j]+d[i1]*d[k]*d[j]);  
end;  
end;  
2
3
Với cách cài đặt trên,chi phí không gian là O(n ), chi phí thi gian là O(n ) (đây là bài toán có  
chi phí ln nht trong tt cả các bài toán QHĐ thưng gp).  
4. Mt sbài toán khác  
a) Chia đa giác  
Cho một đa giác lồi N đnh. Bằng các đưng chéo không ct nhau, ta có thể chia đa giác thành  
N–2 tam giác. Hãy xác định cách chia có tổng các đường chéo ngn nht.  
Hướng dn: Để đơn giản ta coi mọi đoạn thng nối 2 đỉnh đều là “đường chéo” (nếu ni 2  
đỉnh trùng nhau hoặc 2 đỉnh liên tiếp thì có độ dài bng 0).  
Gi F(i,j) là tổng độ dài các đường chéo khi chia đa giác gồm các đỉnh từ i đến j thành các  
tam giác. Nếu j<i+3 thì đa giác đó có ít hơn 4 đnh, không cn phải chia nên F(i,j)=0. Ngược  
lại ta xét cách chia đa giác đó bằng cách chn một đỉnh k nm gia i,j và ni i,j với k. Khi đó  
F(i,j)=F(i,k)+F(k,j)+d(i,k)+d(k,j); d(i,k) là độ dài đường chéo (i,k).  
Tóm li công thức QHĐ như sau:  
F(i,j)=0 vi j<i+3.  
F(i,j)=min(F(i,k)+F(k,j)+d(i,k)+d(k,j) vi k=i+1,...j1).  
F(1,n) là tổng đưng chéo ca cách chia tối ưu.  
b) Biu thc shc (IOI 1999)  
Cho biu thc a1•a2•…•an, trong đó ai là các sthực không âm và • là mt phép toán + hoc  
× cho trước. Hãy đặt các du ngoặc để biu thức thu đưc có kết quln nht.  
Hướng dn: Gi F(i,j) là giá trln nht có thcó ca biu thc ai•ai+1•…•aj. Dthy nếu i=j  
thì F(i,j)=ai, nếu j=i+1 thì F(i,j)=ai•aj. Nếu j>i+1 thì có thtính biu thc ai•ai+1•…•aj bng  
cách chia thành 2 nhóm: (ai•ai+1•…•ak)•(ak+1•…•aj), Khi đó F(i,j)=F(i,k)•F(k+1,j).  
Tóm li, công thức QHĐ là:  
Trang11  
F(i,i)=ai  
F(i,i+1)=ai•ai+1  
• F(i,j)=max(F(i,k)•F(k+1,j) với k=i+1,i+2,..j1).  
(Chú là là các hng tcủa dãy đu không âm và các phép toán là + hoc × nên F(i,k) và  
F(k+1,j) đạt max thì F(i,k)•F(k+1,j) cũng đạt max).  
VI. Ghép cp  
1.Mô hình  
Có n lhoa sp thẳng hàng và k bó hoa được đánh số thttnhỏ đến ln. Cn cm k bó hoa trên  
vào n lsao cho hoa có sthtnhphải đứng trước hoa có sthtln. Giá trthm mỹ tương ứng  
khi cm hoa i vào lthj là v(i,j) Hãy tìm 1 cách cm sao cho tng giá trthm mlà ln nht. Chú ý  
rng mi bó hoa chỉ được cm vào 1 lvà mi lọ cũng chỉ cắm được 1 bó hoa. (IOI 1999)  
2. Công thc :  
Nhn xét rng bài toán nêu trên là mt bài toán ghép cp có yêu cu vthtnên ta có thể  
gii quyết bằng phương pháp QHĐ.  
Hàm mc tiêu : f: tng giá trthm mca cách cm.  
Giá trthm mphthuc vào các hoa và các lọ đang đưc xét nên ta sdùng mng 2 chiu  
để lưu bảng phương án.  
L(i,j): tng giá trthm mln nhất khi xét đến hoa i và lọ j. Khi tính L(i,j) hoa đang xét sẽ là  
hoa i và lj.  
Nếu i = j. Chcó mt cách cm L(i,i):= v[1,1]+v[2,2]+...v[i,i]  
Nếu i>j . Không có cách cm hp lý  
Nếu i<j : Có 2 trường hp xy ra:  
Cm hoa i vào lj. Tng giá trthm mlà L(i-1,j-1)+v(i,j). (Bng tng giá trị trước khi  
cm cng vi giá trthm mkhi cm hoa i vào lj)  
Không cm hoa i vào lj (có thcm vào lọ trước j), giá trthm mca cách cắm là như  
cũ : L(i,j-1)  
3. Cài đặt :  
L[i,j]:= -maxint;  
For i:=1 to k do  
For j:=i to n do  
If i = j then L[i,j]:=sum(i)  
else  
if i<j then L[i,j]:=max(L[i-1,j-1]+v[i,j],L[i,j-1]);  
4. Mt sbài toán khác  
a) Câu lc b:( Đề thi chn HSG Tin Hà Nội năm 2000)  
Có n phòng học chuyên đề và k nhóm học được đánh số thttnhỏ đến ln. Cn xếp k  
nhóm trên vào n phòng hc sao cho nhóm có shiu nhỏ được xếp vào phòng có shiu nh,  
nhóm có shiu ln phải được xếp vào phòng có shiu ln.Vi mi phòng có chhc sinh,  
các ghế tha phải được chuyn ra hết, nếu thiếu ghế thì lấy vào cho đủ ghế .Biết phòng i có  
Trang12  
a(i) ghế ,nhóm j có b(j) hc sinh. Hãy chọn 1 phương án bố trí sao cho tng sln chuyn ghế  
ra và vào là ít nht.  
Hướng dn : Khi xếp nhóm i vào phòng j thì sln chuyn ghế chính là đchênh lch gia  
sghế trong phòng i và shc sinh trong nhóm. Đặt v[i,j]:=|a(i)-b(j)|  
b) Mua giày (Đề QG bảng B năm 2003)  
Trong hiệu có n đôi giày, đôi giày i có kích thước hi. Có k người cần mua giày, người i cn  
mua đôi giày kích thước si . Khi người i chọn mua đôi giày j thì độ lch slà |h(i)-s(j)|. Hãy  
tìm cách chọn mua giày cho k người trên sao cho tổng độ lch là ít nht. Biết rng mỗi người  
chỉ mua 1 đôi giày và 1 đôi giày cũng chỉ có một người mua.  
Hướng dn : Lp công thc giải như bài Câu lc b. Chú ý chứng minh tính đúng đắn ca bổ  
đề heuristic sau :Cho 2 dãy tăng dần các số dương a1a2...an , b1b2...bn. Gi c1c2...cn là mt  
hoán vca dãy {bn}. Khi  
đó : |a(1)-b(1)|+ |a(2)-b(2)|+...+ |a(n)-b(n)|< |a(1)-c(1)|+ |a(2)-  
c(2)|+...+ |a(n)-c(n)|  
VII. Di chuyn  
1. Mô hình  
Cho bng A gm MxN ô. Tô (i,j) có thdi chuyn sang 3 ô (i+1,j), (i+1,j1) và (i+1,j+1).  
Hãy xác định mt lộ trình đi từ hàng 1 đến hàng M sao cho tổng các ô đi qua là ln nht.  
2. Công thc  
Gi F(i,j) là giá trln nht có được khi di chuyn đến ô (i,j). Có 3 ô có thể đi đến ô (i,j) là (i–  
1,j), (i1,j1) và (i–1,j+1). Do đó ta có công thức QHĐ như sau:  
F(1,j)=A[1,j]  
F(i,j)=max(F(i1,j),F(i1,j1),F(i1,j+1))+A[i,j] vi i>1  
3. Cài đặt  
Bảng phương án là bng 2 chiu F[0..m,0..n]. (Tt cả các ô trên biên đều cho giá trbng 0).  
Quá trình tính như sau:  
for i:=1 to m do  
for j := 1 to n do  
F[i,j]=max[F[i1,j],F[i1,j1],F[i1,j+1]]+A[i,j];  
Cách cài đặt này cho chi phí không gian và thời gian đều là O(n2). Ta có thtiết kim không  
gian nhbng cách tính trc tiếp trên mng A.  
4. Mt sbài toán khác  
a) Tam giác (IOI 1994)  
Cho mt tam giác gm các snguyên không âm. Hãy tính tng ln nht các số trên đường đi  
từ đỉnh tam giác xung một điểm nào đó ở đáy tam giác nào đó. Tại mi ô ta chỉ có đi thẳng  
xung, sang ô bên trái hoc bên phi.  
Hướng dn: Mô tcác phn tca tam giác số như một ma trn, A[i,j] là phn tthj trên  
dòng i (với 1≤i≤N và 1≤j≤i). Có 2 ô có thể di chưyển đến ô (i,j) là ô (i1,j1) và ô (i1,j). Gi  
F(i,j) là tng ln nht có thể có khi đi đến ô (i,j) ta có:  
Trang13  
F(1,1)=A[1,1]  
F(i,1)=F(i1,1)+A[i,1]  
F(i,j)=max(F(i1,j1),F(i1,j))+A[i,j]  
b) Con kiến  
Có mt ng hình tr, khi tri phng ra có thlà mt bng MxN ô. Giá trA[i,j] là lưng thc  
ăn có ở ô dòng i ct j. Mt con kiến xut phát tmt ô mép bên trái ca hình trvà bò  
sang mép bên phi. Tô (i,j) kiến có thbò sang 1 trong 3 ô (i1,j+1), (i,j+1) hoc (i+1,j+1).  
(Chú ý: vì ng hình trnên kiến đang ở dòng 1 có thbò xuống dòng M và ngược li). Bò qua  
ô nào thì kiến mang theo toàn bộ lượng thức ăn ở ô đó. Hãy tìm đường đi mà kiến kiếm được  
nhiu thức ăn nhất.  
Hướng dn: Để xlí tình hung hình trụ, ta lưu dòng 0 là dòng M và dòng M+1 là dòng 1.  
Khi đó tương tự như bài toán ban đầu, gọi F(i,j) là lượng thức ăn kiến có được khi bò đến ô  
(i,j), ta thiết lập được công thức QHĐ sau:  
F(i,1)=A[i,1]  
F(i,j)=max(F(i1,j1),F(i,j1),F(i+1,j+1))+A[i,j] vi j>1  
Trang14  
pdf 14 trang baolam 28/04/2022 8080
Bạn đang xem tài liệu "Một số bài toán quy hoạch động điển hình", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfmot_so_bai_toan_quy_hoach_dong_dien_hinh.pdf