Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 17 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
17
Dung lượng
142,5 KB
Nội dung
Bài 3: bài toán tìm xâu trong chung cực đại của 2 xâu cho trước 3.1. Nê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á đi một số ký tự nào đó của T. Ví dụ: ‘ABC’ là xâu trong của ‘GAHEBOOC’ bằng cách xó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ó độ dài cực đại. Ví dụ: T1=‘ABCDAE’ và T2=‘XYACADK’ có xâu ‘ACD’ là xâu trong chung với độ dài cực đại. Ta có thông tin vào và thông tin ra của bài toán là: + Input: Hai xâu T 1 , T 2 + Output: Độ dài cực đại của xâu của xâu con chung và xâu con chung S. 3.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 Giả sử ta có: Xâu T 1 = “a 1 a 2 …a m ”, chiều dài: m Xâu T 2 = “b 1 b 2 …b n ”, chiều dài: n Gọi L(r,s) là bài toán xâu con chung cực đại, với r ∈ N: Độ dài dãy a 1 a 2 …a m ( r ≤ m ) s ∈ N: Độ dài dãy b 1 b 2 …b n (s ≤ n) (Bài toán ban đầu là L(m, n)) Các giá trị cần tìm: L[r,s]: độ dài cực đại của xâu con chung của bài toán L(r, s). S: xâu con chung của bài toán L(r,s) Bước 2: Giải pháp đệ quy - T/h 1:Khi (r=0) hoặc (s=0) L(r,s)=0 {Một trong hai xâu đã cho là rỗng thì độ dài xâu chung cực đại bằng 0} - T/h 2: Khi (r>0) và (s>0) và (a r <> b s ) L(r,s) = Max(L(r-1,s), L(r,s-1)) - T/h 3: Khi (r>0) và (s>0) và (a r =b s ) L(r,s)= 1 + L(r-1,s-1) Bước 3: Lập bảng Nhận xét: - Ta nhận thấy nếu T1 r =T2 s , lúc xâu con chung cực đại S của T 1 và T 2 có thể tính bằng xâu con chung cực đại S’ của T r-1 và T s-1 , đồng thời nối a i vào cuối, tức S = S’+ a r - Nếu T1<>T2 s , lúc này cho S 1 là độ dài xâu chung cực đại xâu của T r-1 và T s , và S 2 là độ dài xâu chung cực đại của T r và T s-1 . S sẽ là giá trị lớn nhất trong 2 giá trị S 1 và S 2 . L[r,s] = 0 nếu r = 0 hoặc s = 0 1 + L[r -1, s – 1] nếu T1 i = T2 j Max(L[r -1, s], L[r, s -1]) nếu T1 r <> T2 s Độ phức tạp tính toán là: O(m*n) Procedure Lapbang; var r,s:integer; begin n:=length(T1); m:=length(T2); for r:=0 to m do for s:=0 to n do if (r=0)or(s=0) then Begin l[r,s] := 0; u=‘’; end else if T1[r]=T2[S] then Begin l[r,s] := l[r-1,s-1]+1; u:=T1[r]; End else l[r,s]:= Max(l[r-1,s],l[r,s-1]); End; Bước 4: Tổng hợp kết quả Để tìm xâu kết quả S: Ta đi ngược từ ô L[m,n] hướng về ô L[0, 0] - Nếu a r = b s thì đặt ai hoặc bj vào bên trái dãy S (ở đầu xâu) và về ô L[r-1,s-1] - Nếu a r <> b s thì + lùi về L[r - 1, s] trong trường hợp L[r - 1, s] > L[r, s - 1] + ngược lại, lùi về L[r, s – 1] trong trường hợp L[r - 1, s] ≤ L[r,s – 1] Procedure THKQ; Begin u:=’’; r:= n; s := m; While (r > 0) And (s >0) Do Begin If T1[r] = T2[s] Then Begin u := u+T1[r]; dec(r); dec(s); End Else If L[r - 1, s] > L[r, s - 1] then dec(r) Else dec(s); End; Writeln(f,‘Do dai xau chung cuc dai là: ’, length(u)); Writeln(f,‘Xau chung cuc dai là:’, u); Close(f); End; Độ phức tạp: O(max(n,m)) CHƯƠNG TRÌNH CHÍNH BEGIN CLRSCR; Nhapdl; Lapbang; Tonghopketqua; END. CHƯƠNG TRÌNH MÔ PHỎNG TÌM XÂU CON CHUNG CỰC ĐẠI BẰNG NNLT PASCAL Uses crt; Const f1='XAU.INP'; f2='KETQUA.OUT'; Var n,m,r,s:integer; T1,T2:String; x:Array[1 10] of string; l:Array[1 10,1 10] of integer; u:String; f:text; Procedure NhapDL; Begin assign(f,f1); reset(f); readln(f,T1); readln(f,T2); close(f); assign(f,f2); rewrite(f); End; Function max(x,y:integer):integer; Begin If x>y Then max:=x Else max:=y; End; Procedure lapbang; Begin m:=length(T1); n:=length(T2); {FillChar(L, SizeOf(L), 0);} For r:=1 To m Do For s:=1 To n Do If T1[r] = T2[s] Then L[r,s]:= 1 + L[r-1,s-1] Else L[r,s]:= max (L[r,s-1] , L[r-1,s]); End; Procedure tonghopketqua; Begin r:=m; s:=n; u:=''; While (r>0) and (s>0) Do Begin If T1[r]=T2[s] Then Begin Insert(T1[r], u, 1); Dec(r); Dec(s); End Else Begin If L[r, s]= L[r-1, s] Then Dec(r) Else Dec(s); End; End; Writeln(f,'Do dai xau chung cuc dai la: ', length(u)); Writeln(f,'Xau chung cuc dai la: ',u); Writeln(f,'Bang phuong an toi uu.'); For r:=1 To m Do Begin For s:=1 To n Do write(f,l[r,s]:4); writeln(f); End; Close(f); End; BEGIN nhapDL; lapbang; tonghopketqua; END. Giả sửa file XAU.INP khi chạy chương trình trên ta được file KETQUA.OUT như sau: ABCDAE XYACADK Do dai xau chung cuc dai la: 3 Xau chung cuc dai la: ACD Bang phuong an toi uu. 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 2 2 2 2 0 0 1 2 2 3 3 0 0 1 2 3 3 3 0 0 1 2 3 3 3 Bài 4: bài toán Du lịch Bài 4: bài toán Du lịch 4.1. Nêu bài toán 4.1. Nê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 (hoặc không đi qua) các thành phố khác 1, 2, , n-1, theo lộ trình: 0 → i 1 → i 2 … → i k → n Trong đó: 0 < i 1 < i 2 < …< i k < n, Giá vé của xe đi từ thành phố i đến thành phố j là c[i,j] (với i < j). Tì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. Từ bài toán đã nêu, ta có thông tin đầu vào và đầu ra của bài toán như sau: + Input: + n là thành phố cần đến + C[i, j] là ma trận về vé xe để đi từ thành phố i đến thành phố j (i, j =0 n) + Output: Đường đi đến thành phố n sao cho chi phí nhỏ nhất 4.2. Phương pháp thực hiện, sử dụng phương pháp quy hoạch động theo 4 bước sau: 4.2. Phương pháp thực hiện, sử dụng phương pháp quy hoạch động theo 4 bước sau: Bước 1. Phân tích bài toán - Gọi ρ(s) là bài toán du lịch, với: s N là thành phố cần đến. - Bài toán ban đầu là ρ(n) - Các giá trị cần tìm: o l[s]: chi phí nhỏ nhất để đi từ thành phố 0 → s của bài toán ρ(s) o u[s]: đỉnh kế cuối trên đường đi từ thành phố 0 → s của bài toán ρ(s) Bước 2. Giải pháp đệ quy - Khi s = 0 thì o l[s] = 0 o u[s] = -1 ( vì không có đỉnh kế cuối) - Khi s > 0 : o l[s] = min (l[k] + c[k,s]) (0 ≤ k<s) = l[k’] + c[k’,s] (với k’ là chi phi đi từ đỉnh 0 đến đỉnh kế cuối nhỏ nhất) o u[s] = k’ Bước 3. Lập bảng Procedure Lapbang; Begin for s:= 0 to n do if (s = 0) then Tính l[0] và u[0] else Tính l[s] và u[s] End; Độ phức tạp tính toán: O(n 2 ) Bước 4. Tổng hợp kết quả Procedure Tonghop; Var i, s : byte; Begin s := n; {Xuất phát từ thành phố s cuối cùng, ta đi ngược trở lại để tìm các điểm đã đi qua} i:=0; {mảng X[i] dùng để lưu dấu vết các địa điểm thành phố đã đi qua} while ((s>=0) do {Max la so lon nhat neu khong co duong di qua 1 cap dinh} Begin i := i+1; X[i] := s; s := u[s]; End; Writeln(‘Chi phi nho nhat cua duong di la: ’, L[n]); Write('Duong di voi chi phi nho nhat: '); for s := i downto 1 do write(x[s],’ ‘); End; End; • Độ phức tạp tính toán: O(n) CHƯƠNG TRÌNH MÔ PHỎNG BÀI TOÁN DU LỊCH BẰNG NNLT PASCAL Bài Bài 5: Bài toán sinh viên ôn thi 5: Bài toán sinh viên ôn thi 5.1. Nêu bài toán: 5.1. Nêu bài toán: Một sinh viên cần ôn thi n môn trong m ngày. Theo kinh nghiệm của anh ta, nếu ôn môn i trong j ngày thì được điểm là a[i,j]. Giả sử cho biết các a[i,j] (với a[i,j] ≤ a[i,j+1]). Tìm bộ x[i] (số ngày ôn môn i, với i =1 n) sao cho Σx[i] = m và sinh viên đạt tổng điểm lớn nhất (hay: Σa[x[i], i] → max). Từ nội dung bài toán, ta thấy thông tin vào và ra của bài toán như sau: + Input: n: số môn thi m: số ngày ôn thi a[i,j]: ma trận thể hiện điểm môn i nếu ôn trong j ngày (i: 1 n , j: 1 m) + Output: x[i] là số ngày ôn thi của môn i (i = 1 n) sao cho Σ a[x[i], i] → max) Môn thi thứ i 1 2 … n- 1 n Số ngày ôn thi (x[i]) ? ? … ? ? 5.2. Phương pháp thực hiện, sử dụng phương pháp quy hoạch động theo 4 bước sau: 5.2. Phương pháp thực hiện, sử dụng phương pháp quy hoạch động theo 4 bước sau: B1: Phân tích bài toán Gọi P(r,s) là bài toán sinh viên ôn thi s môn trong r ngày =>Bài toán ban đầu: P(m,n) Các giá trị cần tìm: l[r,s]: số điểm cực đại [...]... u[r,s]: = k1; End; End; Procedure TongHop Begin S:=n; r:=m; For s:=n downto 1 to Begin x[s]:= u[r,s]; r:=r – x[s]; End; End; Ví dụ: 3 1 2 3 4 5 6 7 7 2 3 5 6 7 8 9 2 3 4 5 6 7 8 Số điểm cao nhất: 10 Môn 1: 3 ngày Môn 2: 3 ngày Môn 3: 1 ngày CHƯƠNG TRÌNH MÔ PHỎNG BÀI TOÁN SINH VIÊN ÔN THI BẰNG NNLT PASCAL Uses crt; Const fname='onthi.in'; Var n,p,m:integer; x:array[1 10] of integer; a,u,l:array[0 10,0...u[r,s]: số ngày tối ưu để ôn môn s B2: Phương pháp đệ quy • s>1 l[r,s] = Max(l[r-k,s-1] + a[k,s]) 0= . Bài 3: bài toán tìm xâu trong chung cực đại của 2 xâu cho trước 3.1. Nê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á đi một số ký tự nào đó của T. Ví. dụ: ‘ABC’ là xâu trong của ‘GAHEBOOC’ bằng cách xó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ó độ dài cực đại. Ví dụ: T1=‘ABCDAE’. và T2=‘XYACADK’ có xâu ‘ACD’ là xâu trong chung với độ dài cực đại. Ta có thông tin vào và thông tin ra của bài toán là: + Input: Hai xâu T 1 , T 2 + Output: Độ dài cực đại của xâu của xâu