Báo cáo chuyên đề tốt nghiêp
LI NểI U
Trong quỏ trỡnh hc tp, chỳng ta gp rt nhiu cỏc bi tp v Toỏn-Tin.
Cỏc bi tp dng ny rt phong phỳ v a dng. Thc t cha cú thut toỏn hon
chnh cú th ỏp dng cho mi bi toỏn. Tuy nhiờn ngi ta ó tỡm ra mt s
thut toỏn chung nh chia tr, tham n, quay lui, Cỏc thut toỏn ny cú th
ỏp dng gii mt lp khỏ rng cỏc bi toỏn hay gp trong thc t.
ti ca em l tỡm hiu v phng phỏp quy hoch ng, t tng c
bn ca phng phỏp ny l: gii mt bi toỏn ta chia bi toỏn ú thnh cỏc
bi toỏn nh hn cú th gii mt cỏch d dng. Sau ú kt hp li gii cỏc bi
toỏn con, ta cú c li gii bi toỏn ban u. Trong quỏ trỡnh gii cỏc bi toỏn
con ụi khi ta gp rt nhiu kt qu trựng lp ca cỏc bi toỏn con. tng tớnh
hiu qu, thay vỡ phi tớnh li cỏc kt qu ú, ta lu chỳng vo mt bng. Khi
cn li gii ca mt bi toỏn con no ú ta ch cn tỡm trong bng, khụng cn
tớnh li.
Cựng vi s ch bo tn tỡnh ca cụ Hong Th Kim Ngõn em ó hon
thnh bỏo cỏo ny. Trong bỏo cỏo khụng trỏnh khi nhng sai xút mong thy,
cụ v cỏc bn gúp ý bn bỏo cỏo c hon thin hn.
GVHD: Hoàng Thị Kim Ngân SVTH: Trần Đình Vũ
Báo cáo chuyên đề tốt nghiêp
CHNG I: Lí THUYT
T tng ca thut toỏn quy hoch ng khỏ n gin. Tuy nhiờn khi ỏp
dng thut toỏn vo trng hp c th li khụng d dng. Khi gii bi toỏn bng
phng phỏp ny, chỳng ta phi thc hin hai yờu cu quan trng sau:
- Tỡm cụng thc truy hi xỏc nh nghim bi toỏn qua nghim cỏc bi toỏn
con nh hn.
- Vi mi bi toỏn c th, ta ra phng ỏn lu tr nghim mt cỏch hp
lý t ú cú th truy cp mt cỏch thun tin nht.
I- Cụng thc truy hi
1- Vớ d
Cho s t nhiờn n
100. Hóy cho bit cú bao nhiờu cỏch phõn tớch s n
thnh tng ca dóy cỏc s nguyờn dng, cỏc cỏch phõn tớch l hoỏn v ca
nhau ch tớnh l mt cỏch.
Vớ d: n = 5 cú 7 cỏch phõn tớch:
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
(Lu ý: n = 0 vn coi l cú 1 cỏch phõn tớch thnh tng cỏc s nguyờn
dng (0 l tng ca dóy rng))
Nhn xột:
Nu gi F[m,v] l s cỏch phõn tớch s v thnh tng cỏc s nguyờn dng
m. Khi ú:
GVHD: Hoàng Thị Kim Ngân SVTH: Trần Đình Vũ
Báo cáo chuyên đề tốt nghiêp
Cỏc cỏch phõn tớch s v thnh tng cỏc s nguyờn dng
m cú th chia
lm hai loi:
- Loi 1: Khụng cha s m trong phộp phõn tớch, khi ú s cỏch phõn tớch
loi ny chớnh l s cỏch phõn tớch s v thnh tng cỏc s nguyờn dng
< m, tc l s cỏch phõn tớch s v thnh tng cỏc s nguyờn dng
m - 1 v
bng F[m - 1,v].
- Loi 2: Cú cha ớt nht mt s m trong phộp phõn tớch. Khi ú nu
trong cỏc cỏch phõn tớch loi ny ta b i s m ú thỡ ta s c cỏc cỏch phõn
tớch s v m thnh tng cỏc s nguyờn dng
m (Lu ý: iu ny ch ỳng
khi khụng tớnh lp li cỏc hoỏn v ca mt cỏch). Cú ngha l v mt s lng,
s cỏc cỏch phõn tớch loi ny bng F[m,v m].
Trong trng hp m > v thỡ rừ rng ch cú cỏc cỏch phõn tớch loi 1, cũn
trong trng hp m
v thỡ s cú c cỏc cỏch phõn tớch loi 1 v loi 2. Vỡ th:
Ta cú cụng thc xõy dng F[m,v] t F[m - 1,v] v F[m,v - m]. Cụng thc
ny cú tờn gi l cụng thc truy hi a vic tớnh F[m,v] v vic tớnh cỏc
F[m,v] vi d liu nh hn. Tt nhiờn cui cựng ta s quan tõm n F[n,n]: S
cỏc cỏch phõn tớch n thnh tng cỏc s nguyờn dng
n.
Vớ d vi n = 5, bng F s l:
GVHD: Hoàng Thị Kim Ngân SVTH: Trần Đình Vũ
B¸o c¸o chuyªn ®Ò tèt nghiªp
Nhìn vào bảng F, ta thấy rằng F[m,v] được tính bằng tổng của:
Một phần tử ở hàng trên: F[m -1,v] và một phần tử ở cùng hàng, bên trái:
F[m,v - m].
Ví dụ F[5,5] sẽ được tính bẳng F[4,5] + F[5,0], hay F[3,5] sẽ được tính
bằng F[2,5] + F[3,2]. Chính vì vậy để tính F[m,v] thì F[m – 1,v] và F[m,v - m]
phải được xác định trước. Suy ra thứ tự hợp lý để tính các phần tử trong bảng F
sẽ phải là theo thứ tự từ trên xuống và trên mỗi hàng thì tính theo thứ tự từ trái
qua phải.
Điều đó có nghĩa là ban đầu ta phải tính hàng 0 của bảng: F[0,v] = số dãy
có các phần tử
≤
0 mà tổng bằng v, theo quy ước ở đề bài thì F[0,0] = 1 còn
F[0,v] với mọi v > 0 đều là 0.
Vậy giải thuật dựng rất đơn giản: khởi tạo dòng 0 của bảng F: F[0,0] = 1
còn F[0,v] với mọi v > 0 đều bằng 0, sau đó dùng công thức truy hồi tính ra tất
cả các phần tử của bảng F. Cuối cùng F[n,n] là số cách phân tích cần tìm
2- Cải tiến thứ nhất
Cách làm trên có thể tóm tắt lại như sau: Khởi tạo dòng 0 của bảng, sau đó
dùng dòng 0 tính dòng 1, dùng dòng 1 tính dòng 2 v.v… tới khi tính được hết
dòng n. Có thể nhận thấy rằng khi đã tính xong dòng thứ k thì việc lưu trữ các
dòng từ dòng 0 tới dòng k – 1 là không cần thiết bởi vì việc tính dòng k + 1 chỉ
phụ thuộc các giá trị lưu trữ trên dòng k. Vậy ta có thể dùng hai mảng một
chiều: Mảng Current lưu dòng hiện thời đang xét của bảng và mảng Next lưu
dòng kế tiếp, đầu tiên mảng Current được gán các giá trị tương ứng trên dòng 0.
Sau đó dùng mảng Current tính mảng Next, mảng Next sau khi tính sẽ mang
các giá trị tương ứng trên dòng 1. Rồi lại gán mảng Current:= Next và tiếp tục
dùng mảng Current tính mảng Next, mảng Next sẽ gồm các giá trị tương ứng
trên dòng 2 v.v
Cách làm trên đã tiết kiệm được khá nhiều không gian lưu trữ, nhưng nó
hơi chậm hơn phương pháp đầu tiên vì phép gán mảng (Current:= Next). Có thể
cải tiến thêm cách làm này
GVHD: Hoµng ThÞ Kim Ng©n SVTH: TrÇn §×nh Vò
Báo cáo chuyên đề tốt nghiêp
3- Ci tin th hai
Ta vn cũn cỏch tt hn na, ti mi bc, ta ch cn lu li mt dũng ca
bng F bng mt mng 1 chiu, sau ú dựng mng ú tớnh li chớnh nú sau
khi tớnh, mng mt chiu s lu cỏc giỏ tr ca bng F trờn dũng k tip.
II- Phng phỏp quy hoch ng
1- Bi toỏn quy hoch
Bi toỏn quy hoch l bi toỏn ti u: gm cú mt hm f gi l hm mc
tiờu hay hm ỏnh giỏ, cỏc hm g
1,
g
2
, , g
n
cho giỏ tr logic gi l hm rng
buc. Yờu cu ca bi toỏn l tỡm mt cu hỡnh x tha món tt c cỏc rng buc
g
1
, g
2,
, g
n
: g
i
(x) = TRUE (
i: 1
i
n) v x l tt nht, theo ngha khụng
tn ti mt cu hỡnh y no khỏc tha món cỏc hm rng buc m f(y) tt hn
f(x)
Cỏc dng bi toỏn quy hoch rt phong phỳ v a dng, ng dng nhiu
trong thc t, nhng cng cn bit rng, a s cỏc bi toỏn quy hoch l khụng
gii c, hoc cha gii c. Cho n nay, ngi ta mi ch cú thut toỏn
n hỡnh gii bi toỏn quy hoch tuyn tớnh li, v mt vi thut toỏn khỏc ỏp
dng cho cỏc lp bi toỏn c th.
2- Phng phỏp quy hoch ng
Phng phỏp quy hoch ng dựng gii bi toỏn ti u cú bn cht
quy, tc l vic tỡm phng ỏn ti u cho bi toỏn ú cú th a v tỡm phng
ỏn ti u ca mt s hu hn cỏc bi toỏn con. i vi nhiu thut toỏn quy
chỳng ta ó tỡm hiu nguyờn lý chia tr thng úng vai trũ ch o trong
vic thit k thut toỏn. gii quyt mt bi toỏn ln, ta chia nú lm nhiu bi
toỏn con cựng dng vi nú cú th gii quyt c lp. Trong phng phỏp quy
hoch ng, nguyờn lý ny cng c th hin rừ: Khi khụng bit cn phi gii
quyt nhng bi toỏn con no, ta s i gii quyt tt c cỏc bi toỏn con v lu
tr nhng li gii hay ỏp s ca chỳng vi mc ớch s dng li theo mt s
phi hp no ú gii quyt nhng bi toỏn tng quỏt hn. ú chớnh l im
GVHD: Hoàng Thị Kim Ngân SVTH: Trần Đình Vũ
Báo cáo chuyên đề tốt nghiêp
khỏc nhau gia Quy hoch ng v phộp phõn gii quy v cng l ni dung
phng phỏp quy hoch ng:
- Phộp phõn gii quy bt u t bi toỏn ln phõn ró thnh nhiu bi
toỏn con v i gii tng bi toỏn con ú. Vic gii tng bi toỏn con li a v
phộp phõn ró tip thnh nhiu bi toỏn nh hn v li i gii tip bi toỏn nh
hn ú bt k nú ó c gii hay cha.
- Quy hoch ng bt u t vic gii tt c cỏc bi toỏn nh nht (bi toỏn
c s) t ú tng bc gii quyt nhng bi toỏn ln hn, cho ti khi gii
c bi toỏn ln nht (bi toỏn ban u)
Phng phỏp quy hoch ng dựng k thut bttom up (i t di lờn):
Xut phỏt t cỏc trng hp riờng n gin nht, cú th tỡm ngay ra
nghim. bng cỏch kt hp nghim ca chỳng, ta nhn c nghim ca bi
toỏn c ln hn. C th tip tc, chỳng ta s nhn c nghim ca bi toỏn.
Trong quỏ trỡnh i t di lờn chỳng ta s s dng mt bng lu gi li gii
ca cỏc bi toỏn con ó gii, khụng cn quan tõm n nú c s dng õu
sau ny.
Khi gii mt bi toỏn con, cn n nghim ca bi toỏn con nh hn, ta ch
cn tỡm kim trong bng, khụng cn phi gii li. Chớnh vỡ th m gii thut
nhn c bng phng phỏp ny rt cú hiu qu.
Trc khi ỏp dng phng phỏp quy hoch ng ta phi xột xem phng
phỏp ú cú tha món nhng yờu cu di õy hay khụng:
- Bi toỏn ln phi phõn ró c thnh nhiu bi toỏn con, m s phi hp
li gii ca cỏc bi toỏn con ú cho ta li gii ca bi toỏn ln.
- Vỡ quy hoch ng l i gii tt c cỏc bi toỏn con, nờn nu khụng
khụng gian vt lý lu tr li gii (b nh, a) phi hp chỳng thỡ phng
phỏp quy hoch ng cng khụng th thc hin c.
- Quỏ trỡnh t bi toỏn c s tỡm ra li gii bi toỏn ban u phi qua hu
hn bc.
Cỏc khỏi nim:
GVHD: Hoàng Thị Kim Ngân SVTH: Trần Đình Vũ
Báo cáo chuyên đề tốt nghiêp
- Bi toỏn gii theo phng phỏp quy hoch ng gi l bi toỏn quy
hoch ng
- Cụng thc phi hp nghim ca cỏc bi toỏn con cú nghim ca bi
toỏn ln gi l cụng thc truy hi (hay phng trỡnh truy toỏn) ca quy hoch
ng
- Tp cỏc bi toỏn nh nht cú ngay li gii t ú gii quyt cỏc bi toỏn
ln hn gi l c s quy hoch ng
- Khụng gian lu tr li gii cỏc bi toỏn con tỡm cỏch phi hp chỳng
gi l bng phng ỏn ca quy hoach ng
Cho n nay, vn cha cú mt nh lý no cho bit mt cỏch chớnh xỏc
nhng bi toỏn no cú th gii quyt hiu qu bng quy hoch ng. Tuy nhiờn
bit c bi toỏn cú th gii bng quy hoch ng hay khụng, ta cú th t
t cõu hi: Mt nghim ti u ca bi toỏn ln cú phi l s phi hp cỏc
nghim ti u ca cỏc bi toỏn con hay khụng? v Liu cú th lu tr c
nghim cỏc bi toỏn con di mt hỡnh thc no ú phi hp tỡm c
nghim bi toỏn ln
- u im ca phng phỏp quy hoch ng: chng trỡnh chy nhanh.
- Phm vi ỏp dng ca phng phỏp quy hoch ng
Cỏc bi toỏn ti u: nh tỡm xõu con chung di nht, bi toỏn ba lụ, tỡm
ng i ngn nht, bi toỏn otomat vi s phộp bin i ớt nht,
Cỏc bi toỏn cú cụng thc truy hi.
- Hn ch ca phng phỏp quy hoch ng:
Phng phỏp quy hoch ng khụng em li hiu qu trong cỏc trng
hp sau:
+ S kt hp li gii ca cỏc bi toỏn con cha chc cho ta li gii ca bi
toỏn ln.
+ S lng cỏc bi toỏn con cn gii quyt v lu tr kt qu cú th rt ln,
khụng th chp nhn c.
+ Khụng tỡm c cụng thc truy hi.
GVHD: Hoàng Thị Kim Ngân SVTH: Trần Đình Vũ
Báo cáo chuyên đề tốt nghiêp
CHNG II
MT S BI TON QUY HOCH NG
1- Bi toỏn cỏi tỳi
Trong siờu th cú n gúi hng (n
100), gúi hng th i cú trng lng l
W[i]
100 v tr giỏ V[i]
100. Mt tờn trm t nhp vo siờu th, tờn trm
mang theo mt cỏi tỳi cú th mang c ti a trng lng M (M
100). Hi
tờn trm s ly i nhng gúi hng no c tng giỏ tr ln nht.
Input: file vn bn BAG.INP
Dũng 1: Cha hai s n, M cỏch nhau ớt nht mt du cỏch
n dũng tip theo, dũng th i cha hai s nguyờn dng Wi, Vi cỏch nhau
ớt nht mt du cỏch
Output: file vn bn BAG.OUT
Dũng 1: Ghi giỏ tr ln nht tờn trm cú th ly
Dũng 2: Ghi ch s nhng gúi b ly
Cỏch gii:
Nu gi F[i, j] l giỏ tr ln nht cú th cú bng cỏch chn trong cỏc gúi
{1, 2, , i} vi gii hn trng lng j. Thỡ giỏ tr ln nht khi c chn trong
s n gúi vi gii hn trng lng M chớnh l F[n, M].
a. Cụng thc truy hi tớnh F[i, j].
Vi gii hn trng lng j, vic chn ti u trong s cỏc gúi {1, 2, ,i 1,
i} cú giỏ tr ln nht s cú hai kh nng:
GVHD: Hoàng Thị Kim Ngân SVTH: Trần Đình Vũ
Báo cáo chuyên đề tốt nghiêp
Nu khụng chn gúi th i thỡ F[i, j] l giỏ tr ln nht cú th bng cỏch
chn trong s cỏc gúi {1, 2, , i 1} vi gii hn trng lng l j. Tc l
F[i, j] = F[i - 1, j]
Nu cú chn gúi th i (tt nhiờn ch xột ti trng hp ny khi m Wi j)
thỡ F[i, j] bng giỏ tr gúi th i l Vi cng vi giỏ tr ln nht cú th cú c
bng cỏch chn trong s cỏc gúi {1, 2, , i 1} vi gii hn trng lng j
Wi. Tc l v mt giỏ tr thu c:
F[i, j] = Vi + F[i - 1, j - Wi]
Vỡ theo cỏch xõy dng F[i, j] l giỏ tr ln nht cú th, nờn F[i, j] s l max
trong 2 giỏ tr thu c trờn.
b. C s quy hoch ng:
D thy F[0, j] = giỏ tr ln nht cú th bng cỏch chn trong s 0 gúi = 0.
c. Tớnh bng phng ỏn:
Bng phng ỏn F gm n + 1 dũng, M + 1 ct, trc tiờn c in c s
quy hoch ng: Dũng 0 gm ton s 0. S dng cụng thc truy hi, dựng dũng
0 tớnh dũng 1, dựng dũng 1 tớnh dũng 2, v.v n khi tớnh ht dũng n.
d. Truy vt:
Tớnh xong bng phng ỏn thỡ ta quan tõm n F[n, M] ú chớnh l giỏ tr
ln nht thu c khi chn trong c n gúi vi gii hn trng lng M. Nu F[n,
M] = F[n - 1, M] thỡ tc l khụng chn gúi th n, ta truy tip F[n - 1, M]. Cũn
nu F[n, M] F[n - 1, M] thỡ ta thụng bỏo rng phộp chn ti u cú chn gúi
th n v truy tip F[n - 1, M - Wn]. C tip tc cho ti khi truy lờn ti hng 0
ca bng phng ỏn.
CODE:
GVHD: Hoàng Thị Kim Ngân SVTH: Trần Đình Vũ
B¸o c¸o chuyªn ®Ò tèt nghiªp
program The_Bag;
const
max = 100;
var
W, V: Array[1 max] of Integer;
F: array[0 max, 0 max] of Integer;
n, M: Integer;
procedure Enter; {Nhập dữ liệu từ thiết bị nhập chuẩn (Input)}
var
i: Integer;
begin
ReadLn(n, M);
for i := 1 to n do ReadLn(W[i], V[i]);
end;
procedure Optimize; {Tính bảng phương án bằng công thức truy hồi}
var
i, j: Integer;
begin
FillChar(F[0], SizeOf(F[0]), 0); {Điền cơ sở quy hoạch động}
for i := 1 to n do
for j := 0 to M do
begin {Tính F[i, j]}
F[i, j] := F[i - 1, j]; {Giả sử không chọn gói thứ i thì F[i, j] = F[i - 1,
j]}
{Sau đó đánh giá: nếu chọn gói thứ i sẽ được lợi hơn thì đặt lại F[i, j]}
if (j >= W[i]) and (F[i, j] < F[i - 1, j - W[i]] + V[i]) then
F[i, j] := F[i - 1, j - W[i]] + V[i];
end;
GVHD: Hoµng ThÞ Kim Ng©n SVTH: TrÇn §×nh Vò
Báo cáo chuyên đề tốt nghiêp
end;
procedure Trace; {Truy vt tỡm nghim ti u}
begin
WriteLn(F[n, M]); {In ra giỏ tr ln nht cú th kim c}
while n <> 0 do {Truy vt trờn bng phng ỏn t hng n lờn hng 0}
begin
if F[n, M] <> F[n - 1, M] then {Nu cú chn gúi th n}
begin
Write(n, ' ');
M := M - W[n]; {ó chn gúi th n ri thỡ ch cú th mang thờm
c trng lng M - Wn na thụi}
end;
Dec(n);
end;
end;
begin
{nh ngha li thit b nhp/xut chun}
Assign(Input, 'BAG.INP'); Reset(Input);
Assign(Output, 'BAG.OUT'); Rewrite(Output);
Enter;
Optimize;
Trace;
Close(Input); Close(Output);
end.
2- Bi toỏn i tin
Cho n loi t giy bc. T giy bc th i cú mnh giỏ A[i]. S t mi loi
khụng gii hn. Cn chi tr cho khỏch hng s tin M ng. Hóy cho bit mi
loi tin cn bao nhiờu t sao cho tng s t l ớt nht. Nu khụng i c thỡ
thụng bỏo KHONG DOI DUOC. N < 50; A[i] < 256; M < 10000
GVHD: Hoàng Thị Kim Ngân SVTH: Trần Đình Vũ
B¸o c¸o chuyªn ®Ò tèt nghiªp
Input: n M
A[1] A[2] … A[n]
Ví dụ: 3 18
3 10 12
Output: Tổng số tờ phải trả.
Số tờ mỗi loại
Cách giải:
Gọi Fx[i] là số tờ ít nhất được dùng để đổi số tiền i. Với i = 1 M.
Với quy ước Fx[i] =
∞
(hoặc 0) khi không đổi được.
X[i] là loại tiền cuối cùng được dùng đổi số tiền i. (chỉ lưu 1 loại tiền)
Giải thuật tạo bảng:
Xếp mệnh giá A[i] tăng dần.
Khởi gán Fx[i] =
∞
, X[i] = 0
∀
j = 1 M
Gán Fx[0] = 0
Với số tiền i chạy từ 1 đến M, ta tính Fx[i] và X[i] bằng cách:
Nếu chọn loại tiền j thì số tiền còn lại là i – A[j]
Fx[i] = Min(F[i – A[j]] + 1) nếu i >= A[j]
Min xét với loại tiền j chạy từ 1 đến n.
X[i] = j ứng với giá trị min của Fx[i]
Dưới đây là mảng Fx[i] và X[i] tính được trong ví dụ trên
(dùng 3 loại tiền 3 đồng, 10 đồng, 12 đồng để đổi số tiền 18 đồng
Procedure TaoBang;
Var i: Word;
J: Byte;
Begin
GVHD: Hoµng ThÞ Kim Ng©n SVTH: TrÇn §×nh Vò
Báo cáo chuyên đề tốt nghiêp
For i:=1 to M do Fx[i]:= VoCuc; {VoCuc = MaxInt 1}
Fx[0]:=0;
FillChar (X, Sizeof(x), 0);
For i:=1 to M do {i l s tin}
For j:=n downto 1 do {j l loi tin}
If i >= A[j] then
If (Fx[i] > Fx[i-A[j]]+1) then
Begin
Fx[i]:= Fx[i-A[j]]+1;
X[i]:=j;
End;
End;
3- Bi toỏn ng i ca robot to thnh s nh phõn ln nht
Cho mt bng ụ vuụng m dũng, n ct (2<=n,m<=30) cỏc ụ ghi cỏc s l 0
hoc 1. Tỡm ng i ca robot, t gúc trỏi trờn (ụ (1,1)) xung gúc phi (ụ (m,
n)) di theo nguyờn tc ch c dch chuyn sang phi v xung di sao cho
cỏc s trờn ng i to thnh mt s nh phõn cú giỏ tr ln nht.
D liu vo: ghi trong tp tin vn bn Robot.inp gm
- Dũng u tiờn ghi giỏ tr m v n
- M dũng tip theo, trờn mi dũng ghi n s 0 hoc 1 cỏc s ny cỏch nhau ớt
nht 1 khong trng.
D liu ra: Ghi vo tp tin vn bn robot.out gm
- Dũng u tin ghi giỏ tr thp phõn ca s nh phõn c to thnh trờn.
- Cỏc dũng tip theo ghi ta cỏc bc i (dũng ghi trc, ct ghi sau).
GVHD: Hoàng Thị Kim Ngân SVTH: Trần Đình Vũ
B¸o c¸o chuyªn ®Ò tèt nghiªp
Ví dụ:
Robot.inp robot.out
5 5
1 0 1 1 0
0 0 1 0 1
0 0 1 0 1
1 0 0 1 1
1 1 0 1 0
3 7 4
1 2
1 3
2 3
3 3
3 4
3 5
4 5
5 5
a. Công thức truy hồi:
Gọi F[i,j] là giá trị thập phân của số nhị phân lớn nhất bằng cách đi từ ô
(1,1) tới ô (i,j).
Khi thêm một chữ số 0 hoặc 1 vào cuối một số nhị phân thì ta sẽ được giá
trị mới là:
2 * (giá trị cũ) + (số thêm).
Ví dụ:
Ta có số 1011 (giá trị thập phân là 11)
+ Ghép thêm số 1 vào sẽ là 10111 (giá trị mới là 23 = 2*11+1)
+ Ghép thêm số 0 vào sẽ là 10110 (giá trị mới là 22 = 2*11+0)
Tại ô (i,j) chỉ có thể đến từ ô (i-1, j) hoặc ô (i, j-1), để giá trị thu được là
lớn nhất thì phải đến từ ô có giá trị lớn hơn, như vậy công thức truy hồi sẽ là:
F[i, j] = 2 * max( F[i, j-1], F[i-1, j] ) + A[i, j]
b. Tính bảng phương án
Để thuận tiện ta cần đặt hàng rào: cột 0 và dòng 0 của cả A và F đều đặt
giá trị -1. Riêng ô A[1, 0] hoặc A[0, 1] cần đặt giá trị 0 để bắt đầu tính thì
F[1,1] = A[1, 1].
GVHD: Hoµng ThÞ Kim Ng©n SVTH: TrÇn §×nh Vò
B¸o c¸o chuyªn ®Ò tèt nghiªp
c. Truy vết
Bằng thủ tục đệ quy: Bắt đầu từ ô (m,n), quá trình truy vết kết thúc khi
ta truy đến đến ô (1,1) và ra giá trị F[m,n], tại mỗi bước truy vết ta sẽ truy về ô
có giá trị lớn hơn trong 2 ô: (m-1,n) và (m,n-1).
Cài đặt bằng ngôn ngữ Pascal:
PROGRAM robot;
VAR A:ARRAY[0 30,0 30] OF BYTE;
F:ARRAY[0 30,0 30] OF LONGINT;
m,n:INTEGER;
PROCEDURE Enter;
VAR i,j:INTEGER;
BEGIN
readln(m,n);
FOR i:=1 TO m DO
BEGIN
FOR j:=1 TO n DO read(A[i,j]);
readln;
END;
FOR i:=0 TO m DO A[i,0]:=-1;
FOR j:=0 TO n DO A[0,j]:=-1;
END;
FUNCTION Max(a,b:LONGINT):LONGINT;
BEGIN
IF (a>b) THEN Max:=a ELSE Max:=b;
GVHD: Hoµng ThÞ Kim Ng©n SVTH: TrÇn §×nh Vò
B¸o c¸o chuyªn ®Ò tèt nghiªp
END;
PROCEDURE Optimize;
VAR i,j:INTEGER;
BEGIN
FOR i:=0 TO m DO F[i,0]:=-1;
FOR j:=0 TO n DO F[0,j]:=-1;
F[0,1]:=0;
FOR i:=1 TO m DO
FOR j:=1 TO n DO
F[i,j]:=2*Max(F[i,j-1],F[i-1,j])+A[i,j];
END;
PROCEDURE Trace(i,j:INTEGER);
BEGIN
IF (i=1) AND (j=1) THEN
writeln(F[m,n])
ELSE
BEGIN
IF F[i,j-1]>F[i-1,j] THEN
Trace(i,j-1)
ELSE
Trace(i-1,j);
writeln(i,' ',j);
END;
END;
BEGIN
Assign(Input,'Robot.inp'); Reset(Input);
GVHD: Hoµng ThÞ Kim Ng©n SVTH: TrÇn §×nh Vò
B¸o c¸o chuyªn ®Ò tèt nghiªp
Assign(Output,'Robot.out'); Rewrite(Output);
Enter;
Optimize;
Trace(m,n);
close(Input);
close(Output);
END.
GVHD: Hoµng ThÞ Kim Ng©n SVTH: TrÇn §×nh Vò
Báo cáo chuyên đề tốt nghiêp
KT LUN
Sau mt thi gian nghiờn cu, tỡm hiu em ó hon thnh ti c giao,
tuy cú gp nhiu khú khn nhng cng em li cho em thờm nhiu kin thc
b ớch, rốn luyn cho em tinh thn hc tp, lm vic c lp, sỏng to. Em hy
vng ti thc tp ny s l tin giỳp em hon thin k nng, to in kin
cho quỏ trỡnh lm vic v hc tp ca em sau ny.
Em xin chõn thnh cm n cụ Hong Th Kim Ngõn l giỏo viờn trc tip
hng dn em lm ti cựng ton th cỏc cụ giỏo b mụn ó tn tỡnh ch bo,
hng dn v giỳp em hon thnh ti thc tp ny.
Em xin chõn thnh cm n!
GVHD: Hoàng Thị Kim Ngân SVTH: Trần Đình Vũ
B¸o c¸o chuyªn ®Ò tèt nghiªp
TÀI LIỆU THAM KHẢO
/> /> />
GVHD: Hoµng ThÞ Kim Ng©n SVTH: TrÇn §×nh Vò
B¸o c¸o chuyªn ®Ò tèt nghiªp
NHẬN XÉT CỦA GIÁO VIÊN
GVHD: Hoµng ThÞ Kim Ng©n SVTH: TrÇn §×nh Vò
B¸o c¸o chuyªn ®Ò tèt nghiªp
MỤC LỤC
GVHD: Hoµng ThÞ Kim Ng©n SVTH: TrÇn §×nh Vò