Tải bản đầy đủ (.doc) (7 trang)

Thuật toán quan hệ động mảng một chiều

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 (86.41 KB, 7 trang )

Thuật toán quy hoạch động trên mảng một chiều
Trần Minh Quang
Bài toán 1: Cho một dãysố nguyên dương a
1
, a
2
,... a
N
. Hãy tỉa bớt mộtsố ít nhất các phần tử
của dãy số nguyên đó và giữ nguyên thứ tự các phần tửcòn lại sao cho dãy số còn lại là
một dãy tăng dần. Ta gọi dãy số nguyên tăngdần còn lại sau khi đã tỉa bớt một số phần tử
là dãy con của dãy đã cho.
Input: Dữ liệu vào được cho bởi tệp văn bản với quy cách:
- Dòng đầu ghi số N là sốphần tử
- Dòng tiếp theo ghi N sốlà các số nguyên của dãy.
Output:
-Ghi ra màn hình: Số lượng phần tử của dãy con cực đại và chỉ số các phần tửtrong dãy
con đó (theo thứ tự tăng dần).
Ví dụ:
- Với Input trong fileDAYSO.INP như sau:
10
10 100 20 1 2 50 70 80 3 60
- thì Output phải là:
1 2 50 70 80
ý tưởng của thuật toánquy hoạch động ở đây là: Để xây dựng dãy con dài nhất của dãy đã
cho chúngta sẽ xây dựng dãy con dài nhất của đoạn phần tử đầu a
1
, a
2
,...a
i


.
Để làm được điều đó: ta gọi S[i] là số lượng phần tử nhiều nhất của dãycon tăng dần, trong
đó a
i
cũng thuộc dãy con trên (nó là phần tửcuối cùng).
Chúng ta sẽ tính S[i] ở từng bước dựa vào các S[i-1],... S[1] như sau:
Ban đầu S[i] với i = 1, 2,... N được gán bằng 1 vì trường hợp xấu nhấtthì dãy con chỉ là
một phần tử.
Với mỗi i >= 2 thì S[i] được tính bằng công thức truy hồi sau:
S[i]:=Max(S[j]+1) với j=i-1,... 1 mà a
j
< a
i
.
Để lấy lại dãy con cực đại ta dùng một mảng Truoc với ý nghĩa: Truoc[i]là chỉ số của phần
tử trước phần tử i trong dãy con cực đại lấy trong dãy a
1
,a
2
,...a
i
.
Bây giờ chúng ta phải tìm vị trí i sao cho S[i] đạt max. Ta lưu vị trí đóvào biến Luu.
Như vậy: S[Luu] chính là số lượng phần tử của dãy con cực đại của dãy đãcho. Và bằng
mảng Truoc ta có thể lấy lại chỉ số các phần tử thuộc dãy con đó.
Đến đây ta gặp một vấn đề: Mảng Truoc chỉ cho phép ta lần ngược từ cuốivề đầu dó đó để
in ra các chỉ số theo thứ tự tăng dần ta phải dùng thêm mộtmảng phụ P và in ngược lại của
mảng P:
dem:=0;
i:=Luu;

While i<>0 do
Begin
Inc(dem);P[dem]:=i;i:=Truoc[i];
End;
Chỉ số theo thứ tự tăng dần của dãy con cực đại được in ra bằng dònglệnh:
For i:=dem downto 1 do Write(P[i],' ');
Tuy nhiên làm như trên có vẻ dài dòng trong khi chúng ta đã nhận ra tínhđệ quy trong việc
lấy ngược lại. Và thủ tục in ra dãy con đã rất ngắn gọn vàsáng sủa:
Procedure Print(i:Integer);
Begin
If i>0 then
Begin
Print(Truoc[i]);Write(i,' ');
End;
End;
Công việc in ra chỉ cần một lời gọi: Print(Luu);
Ta có toàn văn chương trình:
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+,Y+}
{$M 65500,0,655360}
Uses Crt;
Const fi = 'DAYSO.INP';
MaxN=5000;
Var A : Array[1..MaxN] ofInteger;
S :Array[1..MaxN] of Integer;
Truoc : Array[1..MaxN]of Integer;
i,j,Luu : Word;
N : Word;
Procedure Init;
Begin
Fillchar(S,SizeOf(S),1);

Fillchar(Truoc,SizeOf(Truoc),0);
End;
Procedure Readfile;
Var f:Text;
Begin
Assign(f,fi);
Reset(f);
Readln(f,N);
For i:=1 to N do Read(f,A[i]);
Close(f);
End;
Procedure Find;
Begin
For i:=2 to N do
Begin
For j:=i-1 downto 1 do
If (A[j]< and (S[i]
Begin
S[i]:=S[j]+1;
Truoc[i]:=j;
End;
End;
End;
Procedure Print(i:Word);
Begin
If i >0 then
Begin
Print(Truoc[i]);
Write(a[i],' ');
End;

End;
Procedure OutputResult;
Begin
Luu:=N;
For i:=N-1 downto 1 do
If S[i]>S[Luu] then Luu:=i;
Print(Luu);
End;
BEGIN
Clrscr;
Init;
Readfile;
Find;
OutputResult;
Readln;
END.
Qua ví dụ trên chúng ta đã hiểu cách mà thuật toán thể hiện. Bây giờchúng ta sẽ xét tiếp
một bài toán sắp xếp trình tự phục vụ khách hàng mà cáchgiải đều sử dụng thuật toán Quy
hoạch động trên mảng một chiều.
Ta xét tiếp mộtví dụ sau:
Bài toán 2: Tại thời điểm 0, ôngchủ một máy tính hiệu năng cao nhận được đơn đặt hàng
thuê sử dụng máy của nkhách hàng. Các khách hàng được đánh số từ 1 đến n. Khách hàng
i cần sử dụngmáy từ thời điểm d
i
đến thời điểm c
i
(d
i
, c
i

là các số nguyên và 0 < d
i
< c
i
<
1000000000) và sẽ trả tiền sử dụng máy là p
i
(p
i
nguyên, 0 < p
i
≤ 10000000). Bạn cần xác
định xem ông chủ cần nhận phục vụ những khách hàng nào sao cho khoảng thời gian sử
dụng máy của hai khách được nhận phục vụ bất kỳkhông được giao nhau đồng thời tổng
tiền thu được từ việc phục vụ họ là lớnnhất.
Dữliệu vào: Từ file văn bản THUE.INP

×