1. Trang chủ
  2. » Luận Văn - Báo Cáo

BÀI TOÁN TÌM XÂU TRONG CHUNG CỰC ĐẠI CỦA 2 XÂU CHO TRƯỚC

17 979 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

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

Ngày đăng: 02/06/2015, 17:46

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w