Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (72.31 KB, 2 trang )
Bài toán: Cho mảng a[1..n]. Mảng a[p..q] được gọi là một mảng con của a. Trọng
lượng mảng bằng tổng các phần tử của mảng. Tìm mảng con có trọng lượng lớn nhất
(1<=p<=q<=n).
Với bài toán này mình biết một cách làm là sử dụng kĩ thuật chia để trị, nhưng mình
không biết cách lưu giữa chỉ số của mảng con lớn nhất đó.
Chia: chia mảng a thành 2 mảng với độ chênh lệch ít nhất
Trị: gọi aL, aR lần lượt là mảng con có trọng số lớn nhất trong 2 mảng vừa chia ra.
Tổng hợp: mảng con lớn nhất cần tìm có thể là nằm trọn vẹn trong aL, hoặc aR, hoặc
chứa 2 điểm chia
Như vậy, ta có chương trình viết bằng ngôn ngữ tựa Pascal như sau:
function MaxSub(a: mảng; i, j: integer)
begin
if i = j then return a[i]
else
begin
m:= (i + j) div 2;
wL:= MaxSub(a, i, m);
wR:= MaxSub(a, m + 1, j);
wM:= MaxRight(a, i, m) + MaxLelf(a, m + 1, j);
return max(wL, wR, wM);
end;
end;
trong đó :
function MaxLelf(a: mảng; i, j: integer)
begin
max1:= - maxint;
s:= 0;
for k:= j downto i do
begin
s:= s + a[k];
if s > max1 then max1:= s;