Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 13 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
13
Dung lượng
54,5 KB
Nội dung
Qui hoạch động A - Phần đề bài Bài 1 : Cho N số nguyên dơng (0<N<10 4 +1) và một dãy A 1 , A 2 , , A n các số nguyên Tìm trong dãy đã cho một dãy con A i1 , A i2 , , A ik thoả mãn các điều kiện : a) A i j A i j+1 b) i j i j+1 c) k lớn nhất Dữ liệu vào : File BL1.INP có cấu trúc nh sau : Dòng thứ nhất ghi số N Các dòng tiếp theo của nó chứa dãy A 1 , A 2 , , A n mỗi dòng không quá 10 số , các số cách nhau ít nhất một dấu cách . Dữ liệu ra : File BL1.OUT có cấu trúc nh sau : Dòng thứ nhất ghi số k Các dòng tiếp theo chứa k số A i1 , A i2 , , A ik mỗi dòng không quá 10 số , các số cách nhau ít nhất một dấu cách . File Input 12 6 12 8 11 3 4 1 7 5 9 10 2 File Output 3 4 7 9 10 Bài 2 : Cho 2 số nguyên dơng M,N (0<M,N100) và 2 dãy số nguyên : A 1 , A 2 , , A N và B 1 , B 2 , , B M . Hãy loại đi một số phần tử của 2 dãy sao cho các số còn lại của 2 dãy ( giữ nguyên thứ tự cũ ) tạo thành 2 dãy nh nhau và độ dài k là lớn nhất . Dữ liệu vào : File BL1.INP có cấu trúc nh sau : Dòng thứ nhất ghi số N ,M Các dòng tiếp theo của nó chứa dãy A 1 , A 2 , , A N và B 1 , B 2 , , B M mỗi dòng không quá 10 số , các số cách nhau ít nhất một dấu cách . Dữ liệu ra : File BL1.OUT có cấu trúc nh sau : Dòng thứ nhất ghi số k Các dòng tiếp theo chứa k số còn lại của 1 dãy nào đó , mỗi dòng không quá 10 số , các số cách nhau ít nhất một dấu cách . File Input 8 12 0 0 9 2 3 7 3 1 4 4 0 5 0 9 0 3 10 4 8 3 File Output 5 0 0 9 3 3 Bài 3 : ( Di chuyển từ Tây sang Đông ) Cho hình chữ nhật MxN ô vuông ,mỗi ô chứa một số nguyên Bài : ( Bài Mã vạch ) Cho bộ 3 số (N,M,K) nguyên không âm (N<=100,M,K<=33) . Ngời ta định nghĩa mỗi bộ 3 số trên ứng với 1 mã là một xâu kí tự dạng nhị phân thoả mãn : + Chứa đúng N chữ số + Các chữ số 0 liền nhau hoặc các chữ số 1 liền nhau gọi là 1 vạch , phải có đúng M vạch + Số chữ số trong 1 vạch gọi là độ rộng của vạch . Độ rộng tối đa của vạch là K + Vạch đầu tiên của mã phải là vạch gồm các chữ số 1. Lập trình thực hiện các yêu cầu sau : 1) Lấy dữ liệu từ File MV.INP tổ chức nh sau : - Dòng đầu là 3 số N,M,K - Dòng thứ 2 là số p - P dòng tiếp theo : mỗi dòng là một mã M i (0< i <P+1) của bộ mã (M,N,K) 2) Thông tin ra gửi vào File MV.OUT : - Dòng đầu là số nêu tổng số mã của bộ mã (N,M,K) - Tiếp theo gồm p dòng , mỗi dòng ghi 1 số là vị trí của mã M i trong tự điển xếp tăng các mã của bộ mã (N,M,K) . Thí dụ File MV.INP 7 4 3 6 1110100 1101100 1001000 1000100 1101110 1110110 File MV.OUT 16 15 12 3 1 13 16 Phần gợi ý Bài 1 : Tìm dãy con tăng dài nhất : Cho mảng A(N) . Cần xoá ít nhất một số phần tử của dãy này sao cho các phần tử còn lại tạo thành dãy tăng nghiêm ngặt . Ta xây dựng mảng T(N) và mảng D(N) với ý nghĩa : + T[i] là chỉ số j ( trong mảng A ) của phần tử đứng trớc phần tử có chỉ số i (trong mảng A ) khi xét dãy kết quả . + D[i] là độ dài của dãy kết quả khi bài toán trên mảng A(N) mới đợc xét từ phần tử 1 đến phần tử i ( Nghiã là ta tạm giải bài toán với kích thớc đến i - đó là kích thớc không vợt quá kích thớc bài toán đã cho ) . Công thức qui hoạch động của bài toán này là : D[i] = Max { D[j] + 1 / j : j <i mà A[j] < A[i] } Chú ý 1- Khởi trị bài toán : T[1] = 0 , D[1] = 1 2- Xử dụng công thức trên với i>1 , mỗi lần tìm đợc j thoả mãn cần ghi lu T[i]=j 3- Khi xong i=N , tìm lại kết quả nhờ duyệt mảng D . Trớc hết tìm j có D[j] lớn nhất , sau đó truy hồi dần tìm j bằng cách thay j bởi T[j] cho đến khi T[j]=0 Các vị trí j tìm đợc chính là các vị trí trong mảng A cần giữ lại nhng theo thứ tự ngợc . Thí dụ Chỉ số 1 2 3 4 56 A 6 12 8 11 34 T 0 1 1 3 05 D 1 2 2 3 -1-2 Dãy kết quả là : Chỉ số 5 6 8 10 11 A 3 4 7 9 10 Bài 2 : Xoá ít nhất một số phần tử của 2 dãy sao cho sau khi xoá 2 dãy nh nhau Gợi ý : Cần xây dựng mảng C(N,M) với ý nghĩa : C[i,j] là độ dài của dãy còn lại nếu dãy A chỉ xét tới chỉ số i và dãy B chỉ xét tới chỉ số j . Đơng nhiên C[1,j] = 0 nếu A[1] không có trong dãy B(j) ,ngợc lại thì C[1,j] = 1 ; tơng tự C[i,1] = 0 nếu B[1] không có trong dãy A(i) ,ngợc lại thì C[i,1] = 1 . Những trờng hợp còn lại C[i,j] đợc tính theo công thức truy hồi sau : C[i,j] = Max{C[i,j-1],C[i-1,j],C[i-1,j-1]+x} ( Vì : nếu A[i]=B[j] thì C[i,j]= C[i-1,j-1]+1 nếu A[i] không có trong B(j) thì C[i,j]= C[i-1,j] nÕu B[j] kh«ng cã trong A(i) th× C[i,j]= C[i,j-1] ) A - Lêi gi¶i Bµi 1 : {Cho N nguyen duong N<=10000 so , tim day tang dai nhat } Uses Crt; Const Max = 10000; Fi = 'BL14.inp'; Fo = 'BL1.out'; Type Mang = Array[1 Max] of Integer; Var A,D,T : Mang; N,dem : LongInt; F : Text; Procedure TaoF; Var F : Text; i : LongInt; Begin Assign(F,Fi); ReWrite(F); Write('Nhap N = '); Repeat {$I-} Readln(N);{$I+} Until (IoResult=0) and (N>0) and (N<=Max); Writeln(F,N); For i:=1 to N do Begin Write(F,10000-i+1:7); {Write(F,Random(100):3);} If i mod 10 =0 then Writeln(F); End; Close(F); End; Procedure Nhap; Var i : LongInt; Begin FillChar(A,Sizeof(A),0); Assign(F,Fi); Reset(F); Readln(F,N); For i:=1 to N do Read(F,A[i]); Close(F); End; Procedure KhoitriT_D; Begin FillChar(T,Sizeof(T),0); T[1] := 0; D[1] := 1; End; Function Vitritruoc(i : LongInt) : LongInt; Var j,Ld,Lj : LongInt; Begin Ld := 0; Lj := 0; Vitritruoc := 0; For j:=i-1 downto 1 do If A[j]<=A[i] then If D[j]>Ld then Begin Ld := D[j]; Lj := j; End; Vitritruoc := Lj; End; Procedure TaoT_D; Var i : LongInt; Begin KhoitriT_Dl; For i:=2 to N do Begin T[i] := Vitritruoc(i); If T[i]=0 then D[i] := 1 Else D[i] := D[T[i]]+1; End; End; Function MaxD : Longint; Var i,p,Li : LongInt; Begin p := -MaxInt; Li := 0; For i:=1 to N do If D[i]>p then Begin p := D[i]; Li := i; End; MaxD := Li; End; Procedure Timketqua; Var i : LongInt; Begin i := MaxD; D[i] := -D[i]; dem := 1; Repeat i := T[i]; If i<>0 then Begin D[i] := -D[i]; Inc(dem) End; Until i=0; End; Procedure Ghi; Var F : Text; i : LongInt; Begin Assign(F,Fo); ReWrite(F); Writeln(F,dem); dem := 0; For i := 1 to N do If D[i]<0 then Begin Write(F,A[i]:7); Inc(dem); If dem mod 10 = 0 then Writeln(F); End; Close(F); End; BEGIN Clrscr; {TaoF;} Nhap; TaoT_D; Timketqua; Ghi; Writeln('Da xong '); Readln; END. Bµi 2 : Uses Crt; Const Max = 100; Fi = 'qhdong2.inp'; Fo = 'qhdong2.out'; Type M1 = Array[1 Max] of Byte; M2 = Array[1 Max,1 Max] of Byte; Var A,B : M1; C : M2; F,F2 : Text; M,N : Byte; Procedure TaoF; Var i : Byte; F : Text; Begin Write('Nhap do dai 2 mang : M,N = '); Readln(M,N); Assign(F,Fi); ReWrite(F); Writeln(F,M,' ',N); For i:=1 to M do Write(F,Random(100+1),' '); Writeln(F); For i:=1 to N do Write(F,Random(100+1),' '); Close(f); End; Procedure DocF; Var i : Byte; Begin Assign(F,Fi); Reset(F); Readln(F,M,N); For i:=1 to M do Read(F,A[i]); Readln(F); For i:=1 to N do Read(F,B[i]); Close(F); End; Function Max3(x,y,z : Byte) : Byte; Var phu : Byte; Begin If x>y then phu := x Else phu := y; If z>phu then phu := z; Max3 := Phu; End; Function Co(x,L : Integer;D : M1) : Boolean; Var : Byte; Begin For i:=1 to L do If D[i]=x then Begin Co := True; Exit; End; Co := False; End; Procedure Work; Var i,j,dem : Byte; P : M1; Begin FillChar(C,Sizeof(C),0); For i:=1 to M do If Co(B[1],i,A) then C[i,1] := 1 Else C[i,1] := 0; For i:=1 to N do If Co(A[1],i,B) then C[1,i] := 1 Else C[1,i] := 0; For i:=2 to M do For j:= 2 to N do C[i,j] := Max3(C[i-1,j-1]+Ord(A[i]=B[j]),C[i,j-1],C[i-1,j]); Assign(F2,Fo); ReWrite(F2); If C[M,N] = 0 then Begin Writeln(F2,'Khong co nghiem '); Close(f2); Writeln('Chuong trinh da chay xong , xem ket qua trong File ',Fo); Readln; Halt; End; Writeln(F2,'Do dai day chung : ',C[M,N]); i := M; j := N; Dem := 0; While (i>0) and (j>0) do Begin If B[j]=A[i] then Begin Inc(dem); P[dem] := A[i]; Dec(i); Dec(j); End Else If C[i,j] = C[i-1,j] then Dec(i) Else Dec(j); End; For i:=dem downto 1 do Write(F2,P[i],' '); Close(F2); End; BEGIN Clrscr; TaoF; DocF; Work; Writeln('Chuong trinh da chay xong , xem ket qua trong File ',Fo); Readln END. Bµi M· v¹ch : Uses Crt; Const Fi = 'Mv.inp'; Fo = 'Mv.out'; MaxN = 100; MaxM = 33; Type Pt = Array[1 13] of Byte; Ma = Array[1 104] of 0 1; Bang = Array[0 MaxM,0 MaxN] of Pt; Var N,M,K : Byte; F : Bang; X : Ma; P : Pt; Procedure Dan(P : Pt;Var X : Ma); Var i,j,t,tg : Byte; Begin FillChar(X,Sizeof(X),0); T := 0; For i:=1 to 13 do For j:=0 to 7 do Begin Inc(T); X[t] := (P[i] SHR j) and 1; End; End; Procedure Nen(X : Ma;Var P : Pt); Var i,j,t,tg : Byte; Begin FillChar(P,Sizeof(P),0); T := 0; For i:=1 to 13 do Begin Tg := 0; For j:=0 to 7 do Begin Inc(T); Tg := Tg+X[t] SHL j; End; P[i] := Tg; End; End; Procedure Cong(Var A : Ma;B : Ma); Var i,t,nho : Byte; Begin Nho := 0; For i:= 1 to 104 do Begin T := A[i]+B[i]+Nho; A[i] := T mod 2; Nho := T div 2; End; End; Procedure Ta ang; {F[x,y]=So luong cac ma co x vach , dai y ki tu } Var i,j : Byte;F3 : Text; Procedure Xaydung(x,y:Byte); Var i : Byte; A,B : Ma; Begin Dan(F[x,y],A); For i:=1 to k do If i<y then Begin Dan(F[x-1,y-i],B); Cong(A,B); End; Nen(A,F[x,y]); End; Begin FillChar(F,Sizeof(F),0); For i:=1 to M do F[i,i,1] := 1; For i:=1 to K do F[1,i,1] := 1; For i:=2 to M do For j:=i+1 to N do If i*k>=j then Xaydung(i,j); End; Procedure Nhan(Var S : String;T : Byte); Var i,tg,nho,L : Byte; Begin L := Length(S); While(L>1) and (S[1]='0') do Begin Dec(L); Delete(S,1,1); End; Nho := 0; For i:= Length(S) downto 1 do Begin Tg := (Ord(S[i])-48)*T+Nho; S[i] := Char(Tg mod 10 + 48); Nho := Tg div 10; . Writeln('Da xong '); Readln; END. Bµi 2 : Uses Crt; Const Max = 100; Fi = &apos ;qhdong2 .inp'; Fo = &apos ;qhdong2 .out'; Type M1 = Array[1 Max] of Byte; M2 = Array[1 Max,1 Max] of Byte; Var