Bài tập 1 : Viết chương trình con để tính tích của 2 ma trận A và B có kích thước là Am,n và Bp,q. Từ đó xác định độ phức tạp của thuật toán này. . 2 Bài tập 2 : Viết hàm tính an mà có độ phức tạp O(1). 5 Bài tập 3 : Chứng minh rằng thủ tục Sort(n), có độ phức tạp hàm mũ 5 Bài tập 4 : Viết thuật toán đệ quy nhằm xóa tất cả các phần tử có giá trị bằng x trong dãy số nguyên a1,a2,…..,an. 6 Bài tập 5 : Xét danh sách F như phần lý thuyết. Viết thuật toán để liệt kê giá trị trường info của tất cả các nút thuộc danh sách F theo thứ tự ngược. 8 Bài tập 6 : Viết thuật toán để xóa tất cả các nút có giá trị trường info bằng x của danh sách tăng dần F. Từ đó cho biết độ phức tạp của thuật toán. 9 Bài tập 7 : Viết thuật toán để điều chỉnh cây T bất kì thành 1 đống 13 Bài tập 8: Bài toán xác suất 19 Bài tập 9 : Bài toán túi xách 20 Bài tập 10 : Bài toán phép nhân tổ hợp nhiều ma trận 25 Bài tập 11 : Bài toán xâu cực đại 28 Bài tập 12 : Bài toán du lịch 32 Bài tập 13 : Bài toán sinh viên ôn thi 38
Trang 1MỤC LỤC
Bài tập 1 : Viết chương trình con để tính tích của 2 ma trận A và B có kích
thước là A[m,n] và B[p,q] Từ đó xác định độ phức tạp của thuật toán này 2
Bài tập 2 : Viết hàm tính anmà có độ phức tạp O(1) 5
Bài tập 3 : Chứng minh rằng thủ tục Sort(n), có độ phức tạp hàm mũ 5
Bài tập 4 : Viết thuật toán đệ quy nhằm xóa tất cả các phần tử có giá trị bằng x trong dãy số nguyên a[1],a[2],… ,a[n] 6
Bài tập 5 : Xét danh sách F như phần lý thuyết Viết thuật toán để liệt kê giá trị trường info của tất cả các nút thuộc danh sách F theo thứ tự ngược 8
Bài tập 6 : Viết thuật toán để xóa tất cả các nút có giá trị trường info bằng x của danh sách tăng dần F Từ đó cho biết độ phức tạp của thuật toán 9
Bài tập 7 : Viết thuật toán để điều chỉnh cây T bất kì thành 1 đống 13
Bài tập 8: Bài toán xác suất 19
Bài tập 9 : Bài toán túi xách 20
Bài tập 10 : Bài toán phép nhân tổ hợp nhiều ma trận 25
Bài tập 11 : Bài toán xâu cực đại 28
Bài tập 12 : Bài toán du lịch 32
Bài tập 13 : Bài toán sinh viên ôn thi 38
Trang 2BÀI LÀM
Bài tập 1 : Viết chương trìn h con để tính tích của 2 ma trận A và B có kích thước là
A[m,n] và B[p,q] Từ đó xác định độ phức tạp của thuật toán này Chú ý ( n=p)
Write('Nhap so hang cua Ma tran :');Readln(m);
Write('Nhap so cot cua Ma tran :');Readln(n);
Trang 3For j:=1 to n dobegin
Write('Gia tri phan tu thu [',i,',',j,']=');Readln(A[i,j]);
C[i,j]:=0;
For d:=1 to n do C[i,j]:=A[i,d]*B[d,j] + C[i,j];
end;
Trang 4Độ phức tạp tính toán của CTC trên là : O(m*n*p)
Dữ liệu chạy thử :
Nhap so hang cua Ma tran :3 Nhap so cot cua Ma tran :2 Gia tri phan tu thu [1,1]=1 Gia tri phan tu thu [1,2]=0 Gia tri phan tu thu [2,1]=1 Gia tri phan tu thu [2,2]=1 Gia tri phan tu thu [3,1]=0 Gia tri phan tu thu [3,2]=0
Ma tran 1 :
1 0
1 1
0 0 Nhap so hang cua Ma tran :2 Nhap so cot cua Ma tran :4 Gia tri phan tu thu [1,1]=1 Gia tri phan tu thu [1,2]=0 Gia tri phan tu thu [1,3]=1 Gia tri phan tu thu [1,4]=1 Gia tri phan tu thu [2,1]=0 Gia tri phan tu thu [2,2]=1 Gia tri phan tu thu [2,3]=1 Gia tri phan tu thu [2,4]=0
Ma tran 2 :
1 0 1 1
0 1 1 0 TICH HAI MA TRAN :
Trang 6Chứng minh:
- Phép toán tích cực là phép toán so sánh n>1
- Gọi g(n) là số lần thực hiện của phép toán tích cực của chương trình con sort(n)
- Công thức truy hồi của g(n) trong trường hợp xấu nhất g(n)=2g(n -1) + 1
- Dùng phương pháp thế để giải hệ thức truy hồi
Bước 1 : Suy đoán nghiệm g(n)=O(2n)
Bước 2 : Sử dụng phương pháp qui nạp để chứng minh
Chứng minh đúng, với b≥1 và hằng c đủ lớn để thỏa mãn điều kiện biên
Vậy độ phức tạp tính toán của chương trình con Sort(n) là O(2n)
Bài tập 4 : Viết thuật toán đệ quy nhằm xóa tất cả các phần tử có giá trị bằng x trong
dãy số nguyên a[1],a[2],… ,a[n]
Function XoaM_DQ(Var n:integer;x:integer):Mang;
Trang 7{Hàm đệ quy trả về mảng sau khi đã thực hiện xóa các phần tử có giá trị x}
Function XoaM_DQ(Var n:integer;x:integer):Mang;
n:=n-1;
XoaM_DQ(n,x);
endelsebegin
Trang 8Write('Nhap gia tri can xoa : ');Readln(gtxoa);
Write('Mang sau khi xoa :');
Nhap gia tri can xoa : 4
Mang sau khi xoa : 1 6
3
Nhap so phan tu cua mang: 5
Phan tu A[1]=1Phan tu A[2]=3Phan tu A[3]=6Phan tu A[4]=4Phan tu A[5]=3Mang : 1 3 6 4 3Nhap gia tri can xoa : 1Mang sau khi xoa : 3 6
4 3
Nhap so phan tu cua mang: 5
Phan tu A[1]=2Phan tu A[2]=4Phan tu A[3]=6Phan tu A[4]=8Phan tu A[5]=9Mang : 2 4 6 8 9Nhap gia tri can xoa : 6Mang sau khi xoa : 2 4
8 9
Bài tập 5 : Xét danh sách F như phần lý thuyết Viết thuật toán để liệt kê giá trị trường
info của tất cả các nút thuộc danh sách F theo thứ tự ngược, với điều kiện giá trị
Trang 9trường info của nút đó phải lớn hơn số nguyên x cho trước Từ đó đánh giá độ phứctạp của thuật toán này.
Day in nguoc voi gia tri lon hon x17
Bài tập 6 : Viết thuật toán để xóa tất cả các n út có giá trị trường info bằng x của danh
sách tăng dần F Từ đó cho biết độ phức tạp của thuật toán
Procedure XoaGT(Var F:TroNut;x:integer);
XoaGT(F^.next,x);
Trang 12IF F^.info=x thenbegin
{In danh sách ngược}
Write('Nhap so nguyen x : ');Readln(x);
Trang 13Nhap gia tri can xoa : 12
8 10 10 11 14 16 16 17
Danh sach F theo thu tutang dan
8 10 10 11 12 12 14 16 1617
Nhap gia tri can xoa : 17
If (T<>nil) and ((T^.left <> nil) or (T^.right<>nil)) then
If (T^.left = nil) and (T^.right<>nil) then
Trang 14If T^.left^.info>T^.right^.info thenbegin
If T^.info<T^.left^.info thenbegin
Swap(T^.info,T^.left^.info);
DieuChinh(T^.left);
end;
endElse
{Trường hợpT^.left^.info<=T^.right^.info }begin
If T^.info<T^.right^.info thenbegin
Trang 15If T=nil then TimNut:=nil
else if T^.info=x then TimNut:=T
elsebegin
Trang 17else if T^.right=nil then LaDong:=(T^.info>T^.left^.info) andLaDong(T^.left)
else LaDong:=(T^.info>T^.right^.info) and LaDong(T^.right) and(T^.info>T^.left^.info) and LaDong(T^.left);
If (T<>nil) and ((T^.left <> nil) or (T^.right<>nil)) then
If (T^.left = nil) and (T^.right<>nil) thenbegin
DieuChinh(T^.right);
If T^.info<T^.right^.info then Swap(T^.info,T^.right^.info);DieuChinh(T^.right);
endElse if (T^.right = nil) and (T^.left<>nil) then
Trang 18DieuChinh(T^.left);
If T^.left^.info>T^.right^.info thenbegin
If T^.info<T^.left^.info thenbegin
Swap(T^.info,T^.left^.info);
DieuChinh(T^.left);
end;
endElse {Trường hợpT^.left^.info<=T^.right^.info }begin
If T^.info<T^.right^.info thenbegin
Trang 19Kiem tra cay T co la dong khong? : FALSE
Cay T sau dieu chinh
9: 8 7
8: 4 5
4: 2 1
7: 6 3
Kiem tra cay T co la dong khong? : TRUE
Bài tập 8: Bài toán xác suất
1 Phát biểu bài toán:
Tính giá trị xác suất P(i, j) (i, j: byte) Biết rằng:
= 1 nếu i=0 và j>0P(i, j) = (P(i-1, j)+ P(i, j-1))/2 nếu i>0 và j>0
= 0 nếu ngược lại
2 Phương pháp thực hiện, sử dụng phương pháp quy hoạch động với 4 bước là:
Bước 1: Phân tích bài toán
Gọi P(r,s) là bài toán xác suất để tính giá trị xác suất
=> Bài toán ban đầu P(i,j)
Trong đó:
r: tham số thứ nhất, 0 ≤ r ≤ i của bài toán P(r,s)
s: tham số thứ hai, 0 ≤ s ≤ j của bài toán P(r,s)
⇒ Cần tìm P(r,s) là giá trị xác suất của bài toán P(r,s)
Bước 2: Giải pháp đệ quy
- Nếu r>0 và s>0 thì P(r,s) = (P (r-1,s) + P ( r, s-1))/2
- Nếu r=0 và s>0 thì P(r,s) = 1
Trang 20Bước 4 Tổng hợp kết quả P(i,j) = a[i,j]
CODE TÍNH GIÁ TRỊ XÁC SUẤT P(i,j)
End;
p:=a[r,s];
End;
BEGIN
write('nhap cac gia tri i:'); readln(i);
write('nhap cac gia tri j:');readln(j);
write(' Gia tri xac suat do la: ',P(i,j):4:2);
END
Trang 211 Phát biểu bài toán:
Phát biểu bài toán: Một cái kho chứa n loại đồ vật có kích thước và giá trị khácnhau Cụ thể: Loại đồ vật i (i=1 n) có: kích cỡ m[i]∈ N*; gía trị c[i] ∈R; số lượng:không hạn chế
Một tên trộm mang theo chiếc túi có kích cỡ là p∈N* Vậy hắn phải chọn lựamột danh sách các đồ vật sẽ mang đi như thế nào để cho tổng giá trị lấy cắp được làlớn nhất
Tức: Tìm x[1], x[2], , x[n] (với x[i]∈ N : số lượng loại đồ vật thứ i cần lấy)sao cho:∑x[i].m[i] ≤p và∑x[i].c[i] đạt giá trị cực đại
Input: Một cái túi chứa n loại đồ vật có kích thước và giá trị khác nhau.
Output: Tìm x[1], x[2], , x[n] (với x[i] ∈ N: số lượng loại đồ vật thứ i cầnlấy) sao cho:Σx[i].m[i] ≤p vàΣx[i].c[i] đạt giá trị cực đại
2 Phương pháp thực hiện, sử dụng phương pháp quy hoạch động với 4 bước là:
Bước 1: Phân tích bài toán
- Gọi P(r, s) là bài toán chiếc túi xách, với:
Trang 22Bước 2: Xây dựng giải pháp đệ quy
{(1) có nghĩa là: + k∗c[s] là giá trị mang lại khi lấy k đồ vật thứ s,
+ r – k∗m[s] kích thước của cái túi giảm đi k∗m[s],+ (s - 1) số loại đồ vật giảm đi 1
bài toán lớn được tính thông qua bài toán nhỏ hơn}
Bước 3: Lập bảng
Procedure LapBang;
Begin
For s:=1 to n doFor r:=0 to p do
Trang 23CODE BÀI TOÁN CHIẾC TÚI XÁCH
Dữ liệu vào được lưu trong file Input.txt gồm 2 dòng:
+ Dòng đầu là số nguyên n (số đồ vật) và p (cỡ của túi xách)
+ Dòng i+1 (1<=i<=n) ghi 2 số nguyên dương m[i], c[i]
Trang 24k1:= 0;
max:= l[r,s-1];
for k:=1 to r div m[s] dobegin
writeln('Do vat ', s, ' can lay ', x[s], ' cai');
writeln('Gia tri toi uu: ', l[p,n]);
end;
begin
Doc_DL;
Trang 25Do vat 1 lay 0 cai
Do vat 2 lay 0 cai
Do vat 3 lay 0 cai
Do vat 4 lay 0 cai
Do vat 5 lay 8 cai
Gia tri toi uu : 40
Kết quả:
Do vat 1 lay 4 cai
Do vat 2 lay 0 caiGia tri toi uu : 12
Kết quả:
Do vat 1 lay 0 cai
Do vat 2 lay 0 cai
Do vat 3 lay 6 cai
Do vat 4 lay 0 cai
Do vat 5 lay 0 cai
Do vat 6 lay 0 cai
Do vat 7 lay 1 caiGia tri toi uu : 36
Bài tập 10 : Bài toán phép nhân tổ hợp nhiều ma trận
1 Phát biểu bài toán:
Cần tính M = M1×M2× ×Mn
Trong đó: Milà ma trận cấp m[i-1]×m[i] (i=1 n)
Hãy xác định thứ tự thực hiện các phép nhân sao cho số phép tính là tối thiểu.Cần tính M = M1×M2× ×Mn, trong đó: Mi là ma trận cấp m[i-1]×m[i] (i=1 n),thể hiện điều này thông qua bảng sau, đây cũng chính là thông tin vào của bài toán
n: số các ma trậnCấp của các ma trận
m[i] m[0] m[1] m[n]
Trang 26Output: Hãy xác định thứ tự thực hiện các phép nhân sao cho số phép tính là
Trang 27if tam < min then
Trang 28Lan thu 2 thuc hien phep toanthu 1
Lan thu 3 thuc hien phep toanthu 3
Bài tập 11 : Bài toán xâu cực đại
1 Phát biểu bài toán:
Định nghĩa xâu trong: S là xâu trong của T nếu S nhận được bằng cách xoá đimột số ký tự nào đó của T Ví dụ: ‘ABC’ là xâu trong của ‘GAHEBOOC’ bằng cáchxóa đi các ký tự GHEOO của xâu ‘GAHEBOOC’
Bài toán: Cho 2 xâu T1, T2 Tìm một xâu S là xâu trong chung của T1 và T2 có
2 Phương pháp thực hiện, sử dụng phương pháp quy ho ch động với 4 bước là:
Bước 1: Phân tích bài toán
- Gọi P(r,s) là bài toán xâu trong cực đại, với:
Trang 29r: là số ký tự đầu tiên của xâu T1s: là số ký tự đầu tiên của xâu T2
Ví dụ : T1=‘x1x2…xr…xm’ (m=length(T1))
T2=‘y1y2…ys…yn’ (n=length(T2))
⇒Bài toán ban đầu: P (m,n)
- Giá trị cần tìm:
l[r,s] : độ dài xâu trong chung cực đại của bài toán P (r,s)
Bước 2: Giải pháp đệ quy
if T1[r] = T2[s] then F[r,s]:= F[r-1,s-1] + 1else
Trang 30while (r>0) and (s>0) do
begin
if T1[r]= T2[s] then
beginSt:= T1[r]+St;
r:= r-1;
s:= s-1;
endelse
if F[r-1,s] > F[r,s-1] then r:=r-1else
Trang 31if T1[r] = T2[s] then F[r,s]:= F[r-1,s-1] + 1else
Trang 32r:= r-1;
s:= s-1;
endelse
if F[r-1,s] > F[r,s-1] then r:=r-1else
Kết quả:
Xau X: ABCDAE
Xau Y: XYACADKE
-Do dai cuc dai cua xau trong chung la: 4
Xau trong chung cuc dai la: ACAE
Kết quả:
Xau X: DINHVUXau Y: NINHCU -
Do dai cuc dai cua xau trong chung la: 4Xau trong chung cuc dai la: INHU
Bài tập 12 : Bài toán du lịch
1 Phát biểu bài toán:
Một người đi từ thành phố 0 đến thành phố n và có thể đi qua n-1 thành phốkhác 1, 2, , n-1, theo lộ trình: 0→i1→i2 … →ik→n, trong đó: 0 < i1 < i2 < …<
ik < n Giá vé của xe đi từ thành phố i đến thành phố j là c[i,j]
Trang 33Tìm một lộ trình từ thành phố 0 đến thành phố n sao cho tổng chi phí về giá véđạt cực tiểu.
Input:
+ n: số thành phố tối đa có thể đi qua
+ c[i,j]: Ma trận chi phí trong đó c[i,j] là chi phí trực tiếp để đi từ thành phố iđến thành phố j (nếu i và j có đường đi trực tiếp) Nếu không có đường đi trực tiếp đếnc[i,j]=∞
Output:
+ Chi phí nhỏ nhất đến từ thành phố 0 đến thành phố n
+ X[i]: số thứ tự thành phố đi qua
2 Phương pháp thực hiện theo 4 bước sau:
Bước 1 Phân tích bài toán
- Gọi P(r) là bài toán du lịch với r là đỉnh cần đến, điểm xuất phát là 0 Bài toánban đầu P(n)
- Cách giá trị cần tìm:
l[r]: Chi phí nhỏ nhất để đi từ đỉnh 0 đến đỉnh r
u[r]: Đỉnh kế cuối trong đường đi từ đỉnh 0 đến đỉnh r
Bước 2 Giải pháp đệ quy
- Trường hợp chung: khi r > 0
Trang 34v1:= 0;
min:= c[0,r];
for v:=0 to r-1 do
Trang 36var u,l: array [0 nMax] of integer;
C: array [0 nMax,1 nMax] of integer;
x: array [1 nMax] of integer;
Trang 37v1:= 0;
min:= c[0,r];
for v:=0 to r-1 dobegin
Trang 38Kết quả:
Chi phi toi thieu de di la: 5
Lo trinh duong di ngan nhat:
0 ->1 ->3 ->4
Kết quả:
Chi phi toi thieu de di la: 7
Lo trinh duong di ngan nhat:
0 ->2 ->3
Bài tập 13 : Bài toán sinh viên ôn thi
1 Phát biểu bài toán
Một sinh viên còn m ngày để ôn thi n môn Theo kinh nghiệm của anh ta, nếu
ôn môn j trong i ngày thì được điểm là c[i,j] Giả sử cho biết các c[i,j] (với
Trang 39n ∈N* : số môn ôn thi.
c[i,j] ∈R: điểm đạt được khi ôn thi môn j trong i ngày
Output:
x[j]: số ngày ôn thi môn j (j=1 n) sao choΣx[j]=n và Σc[x[j],j] đạt max
2 Phương pháp thực hiện theo 4 bước sau:
Bước 1 Phân tích bài toán
Gọi P(r,s) là bài toán ôn thi với
r : là số ngày ôn thi
s : là số môn ôn thi
=> Bài toán ban đầu: P(m,n)
Tìm:
l[r,s]: tổng điểm lớn nhất Σc[x[j],j]
u[r,s]: số ngày ôn thi môn s (tức là x[s])
Bước 2 Giải pháp đệ quy
- Trường hợp chung: khi s > 1
Trang 40u[r,s]:= r;
endelse
begink1:= 0;
Trang 41writeln('So diem toi da co the duoc la: ',l[m,n]);
writeln('So ngay can on cho cac mon la: ');
for i:= 1 to n do writeln ('Mon ',i,':',x[i]:4);
var c,l,u: array [0 nMax,1 nMax] of integer;
x: array [0 nMax] of integer;
Trang 42k1:= 0;
max:= l[r,s-1];
for k:=0 to r dobegin
Trang 43writeln('So diem toi da co the duoc la: ',l[m,n]);
writeln('So ngay can on cho cac mon la: ');
for i:= 1 to n do writeln ('Mon ',i,':',x[i]:4);
So diem toi da co the duoc la: 27
So ngay can on cho cac mon la:
Mon 1: 0
Mon 2: 2
Mon 3: 1
Kết quả:
So diem toi da co the duoc la: 20
So ngay can on cho cac mon la:
Mon 1: 1Mon 2: 2Mon 3: 0