Một tên trộm đột nhập vào siêu thị mang theo một cái túi có thể mang được tối đa trọng lượng M ≤1000... Hãy tìm một xâu ký tự S dài nhất sao cho S là xâu con của cả hai xâu A và B.[r]
Trang 1BÀI 1: DÃY CON ĐƠN ĐIỆU TĂNG DÀI NHẤT INCSEQ.PAS
Cho dãy số nguyên A = a1, a2, , an (1≤n≤5000, -10000≤ai≤10000) Một dãy con của A là một cách chọn ra trong A một số phần tử và giữ nguyên thứ tự
Yêu cầu: Tìm dãy con đơn điệu tăng của dãy A có độ dài lớn nhất
Dữ liệu vào: Cho từ file văn bản INCSEQ.INP
- Dòng đầu ghi số n
- Dòng thứ hai ghi n số a1, a2, , an cách nhau ít nhất một dấu cách
Kết quả: Ghi ra file văn bản INCSEQ.OUT
- Dòng đầu ghi độ dài của dãy con tìm được
- Các dòng tiếp theo, mỗi dòng ghi hai số tương ứng là chỉ số và giá trị của phần tử được chọn trong dãy A theo thứ tự từ đầu đến cuối
Ví dụ:
10
3 9 4 8 6 2 1 7 10 5
5
1 3
3 4
5 6
8 7
9 10
Const fin ='INCSEQ.INP';
fout='INCSEQ.OUT';
Var L,Truoc,a:array[1 5001] of integer;
n,m,i,k:integer;
f:text;
Begin
Assign(f,fin);
Reset(f);
Readln(f,n);
For i:=1 to n do Read(f,a[i]);
Close(f);
L[n+1]:=0;
For k:=n downto 1 do
Begin
m:=n+1;
For i:=k+1 to n do
If (a[k]<a[i]) and (L[i]>L[m]) then m:=i;
L[k]:=L[m]+1;
Truoc[k]:=m;
End;
m:=1;
For i:=2 to n do
If L[i]>L[m] then m:=i;
Assign(f,fout);
ReWrite(f);
Writeln(f,L[m]);
Repeat
Writeln(f,m,' ',a[m]);
m:=Truoc[m];
Trang 2Until m>n;
Close(f);
End
Trong siêu thị có n gói hàng đánh số từ 1 đến n (n≤1000), gói hàng thứ i có trọng lượng Wi ≤1000 và giá trị Vi ≤1000 Một tên trộm đột nhập vào siêu thị mang theo một cái túi có thể mang được tối đa trọng lượng M ≤1000 Hỏi tên trộm sẽ lấy đi những gói hàng nào để được tổng giá trị lớn nhất?
Dữ liệu vào: Cho từ file văn bản BAG.INP
- Dòng đầu chứa hai số nguyên dương n, M
- n dòng tiếp theo, dòng thứ i ghi hai số nguyên dương Wi và Vi
Kết quả: Ghi ra file văn bản BAG.OUT
- Dòng đầu ghi giá trị lớn nhất tên trộm có thể lấy được
- Dòng thứ hai ghi chỉ số của những gói hàng bị lấy theo thứ tự chỉ số từ nhỏ đến lớn
Ví dụ:
5 11
3 3
4 4
5 4
9 10
4 4
11
1 2 5
Const fin ='BAG.INP';
fout='BAG.OUT';
Var W,V:array[1 1000] of Integer;
T:array[0 1000,0 1000] of Longint;
n,m,i,j,max:Longint;
f:Text;
Begin
Assign(f,fin);
Reset(f);
Readln(f,n,m);
For i:=1 to n do Readln(f,W[i],V[i]);
Close(f);
For i:=1 to n do
For j:=1 to M do
Begin
max:=T[i-1,j];
If j>=W[i] then
If max<T[i-1,j-W[i]] + V[i] then max:=T[i-1,j-W[i]] +V[i];
T[i,j]:=max;
End;
Assign(f,fout);
Rewrite(f);
Writeln(f,T[n,M]);
j:=M;
Trang 3For i:=n downto 1 do
If T[i,j]<>T[i-1,j] then
Begin
V[i]:=0;
j:=j-W[i];
End;
For i:=1 to n do
If V[i]=0 then Write(f,i,' ');
Close(f);
End
Một xâu ký tự Y gọi là xâu con của xâu ký tự X nếu như có thể xóa bớt một số ký
tự trong xâu X (hoặc có thể không xóa) để được xâu Y
Cho hai xâu ký tự A, B có độ dài không quá 1000 ký tự Hãy tìm một xâu ký tự S dài nhất sao cho S là xâu con của cả hai xâu A và B
Dữ liệu vào: Cho từ file văn bản SUBSTR.INP
- Dòng đầu ghi xâu A
- Dòng thứ hai ghi xâu B
Kết quả: Ghi ra file văn bản SUBSTR.OUT
- Dòng đầu ghi độ dài xâu S
- Dòng thứ hai ghi xâu S
Ví dụ:
acbadcbce
badcabacd
6 badcbc
Cho một bảng A kích thước m x n ô vuông, mỗi ô chứa một số nguyên Một người xuất phát từ một ô nào đó của cột 1 cần đi sang cột n (tại ô nào cũng được) với quy tắc đi: từ ô A[i,j] chỉ được quyền di chuyển sang một trong 3 ô A[,i,j+1], A[i-1,j+1], A[i+1,j+1] Hãy tìm vị trí ô xuất phát và hành trình đi từ cột 1 sang cột n sao cho tổng các số của các ô đi qua là lớn nhất
Dữ liệu vào: Cho từ file văn bản MOVE.INP
- Dòng đầu ghi hai số nguyên m, n (1 ≤ m,n ≤ 5000)
- Dòng thứ i trong số m dòng tiếp theo ghi n số, số thứ j tương ứng giá trị
số ghi trong ô A[i,j] (-30000 ≤ A[i,j] ≤ 30000)
Kết quả: Ghi ra file văn bản MOVE.OUT
- Dòng đầu ghi tổng các ô thuộc hành trình
- Dòng thứ hai ghi n số tương ứng với chỉ số dòng của các ô thuộc hành trình theo thứ tự từ trái sang phải
Ví dụ:
Trang 4MOVE.INP MOVE.OUT
4 5
1 3 5 3 2
7 2 4 8 7
5 4 6 7 5
2 9 3 2 1
35
3 4 3 2 2
Giải thích: hành trình (3,1) → (4,2) → (3,3) → (2,4) → (2,5)
BÀI 5: BÀI TOÁN DÃY CON CÓ TỔNG CHIA HẾT CHO K DIVISIBLE.PAS
Cho một dãy gồm n (1≤n≤1000) số nguyên dương A1, A2, , An và số nguyên dương K (1≤Ai≤109, 1≤K≤50) Hãy tìm một dãy con gồm nhiều phần tử nhất của dãy đã cho sao cho tổng các phần tử của dãy con này chia hết cho K
Dữ liệu vào: Cho từ file văn bản DIVISIBLE.INP
- Dòng đầu ghi haisố n, K
- Dòng thứ hai ghi n số a1, a2, , an cách nhau ít nhất một dấu cách
Kết quả: Ghi ra file văn bản DIVISIBLE.OUT
- Dòng đầu ghi độ dài của dãy con tìm được
- Các dòng tiếp theo, mỗi dòng ghi hai số tương ứng là chỉ số và giá trị của phần tử được chọn trong dãy A theo thứ tự từ đầu đến cuối
Ví dụ:
7 5
6 10 1 5 16 15 4 51 6
2 10
4 5
6 15
7 4
1 3 5 3 2
7 2 4 8 7