You are on page 1of 4

Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng

Phần II: Chuyên đề nâng cao


CHUYÊN ĐỀ NÂNG CAO 6
CHUYÊN ĐỀ 6: QUY HOẠCH ĐỘNG
B. QUY HOẠCH ĐỘNG VỚI MẢNG 2 CHIỀU
1. Bài toán: Xâu con chung dài nhất. ( Dãy con chung dài nhất của 2 mảng)
Xâu con chung: Xóa đi một số kí tự của hai xâu thì hai xâu còn lại của chúng bằng nhau.
Ví dụ: a=’CEACEEC’ b=’AECECA’
Xâu con chung: ECEC AEEC
Khi áp dụng QHĐ đê giải bài này ta chú ý xây dựng công thức như sau: Gọi L(i,j) là độ dài dãy con
chung dài nhất của 2 dãy a1..ai và b1..bj. Khi đó ta có:
 Nếu i=0, j=0 thì L[i,j] = 0
 Nếu ai <> bj thì L(i,j) = Max( L[i-1,j] , L[i,j-1] )
 Nếu ai=bj thì L[i,j] = 1 + L[i-1,j-1]
Ở đây ta xây dựng L là mảng 2 chiều để lưu bảng phương án. Vậy rõ ràng kết quả của bài toán Độ dài xâu
con chung dài nhất là L[m,n] Với m là length(a) và n là length(b).
Đoạn code:
Fillchar(L,sizeof(L),0);
For i:=1 to length(a) do
For j:=1 to length(b) do
If a[i]<>b[j] then L[i,j] := Max(L[i-1,j], L[i,j-1])
else L[i,j] := 1 + L[i-1,j-1]
Để truy vết kết quả xâu con chung ta sẽ truy vết dựa vào mảng L: Đi từ ô L[m,n] về ô L[0,0]

Các em tự suy nghĩ thêm về trường hợp truy vết: dựa vào bảng L
 Lặp lại
o Khi nào L[i-1,j]=L[i,j] thì giảm i.
o Khi nào L[i,j-1]=L[i,j] thì giảm j
o Ghi nhận vị trí kí tự giống nhau là a[i]
o Giảm i và j đi 1 {giống như trường hợp giảm từ 4 về 3 như trên bảng}
 Cho đến khi i=0 và j=0.
Bài tập để test:
- SPOJ: Bài BLGEN, Bài QBSRT
2. Bài toán con kiến:
Có một chú kiến bò đi kiếm ăn trên sân trường. Sân trường có kích thước MxN và được chia thành m
hàng n cột đều nhau.
Giáo viên: Lê Thanh Phú 1|Trang Phuleethanh@gmail.com
Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao
Mỗi ô trên sân trường có chứa một số lượng thức ăn nhất định. Chú kiến có thể xuất phát vào
một ô bất kỳ của cột 1 và muốn bò hết sang cột n. Với mỗi bước đi thì chú kiến chỉ có thể bò sang 1
trong 3 ô kề của cột bên cạnh.

Bạn hãy giúp cho chú kiến tìm một đường đi từ cột 1 sang cột n sao cho lượng thức ăn mà chú ăn
được trên đường đi là nhiều nhất.
Hướng giải quyết: Vì theo yêu cầu thì mỗi bước đi nó có thể sang 3 ô của cột kế tiếp như hình vẽ
trên. Vậy ta áp dụng QHĐ vào đây như sau: Ta xây dựng bảng phương án L(i,j) là lượng thức ăn mà kiến
thu được lớn nhất khi bò đến ô (i,j). Vậy thì ta có Kết quả sẽ là Max của cột cuối cùng – Cột n. Vậy từ đây
ta có công thức tính bảng L như sau:
Ban đầu L = 0 Với mọi i,j (Sử dụng Fillchar)
L[i,1] = C[i,1] {Vì kiến xuất phát từ cột 1}
L[i,j] = C[i,j] + Max (của 3 ô trước nó tức: L[i-i,j-1], L[i,j-1], L[i+1,j-1])
L[i-1,j-1]
L[i,j-1] L[i,j]
L[i+1,j-1]
Hình 1: Để đến được ô L[i,j] nó chỉ có thể đến từ 3 ô phía sau như bảng trên.
Để truy ra kết quả đường đi: Các em dựa vào bảng phương án L này. (Tự làm)
Mở rộng: Một số bài toán tương tự như vậy
 Kiến chỉ có thể bò từ ô (1,1) đến ô (m,n): Trường hợp này kết quả là L[m,n]
 Robot bò từ ô 1,1 đến ô m,n tuy nhiên robot chỉ có thể di chuyển xuống ô dưới hoặc sang phải:
o Ban đầu L(i,j)=0
o L[i,j] = C[i,j] + Max (2 ô phía trên L[i-1,j], ô bên trái L[i,j-1]) Với mọi i,j
 Một số bài toán robot di chuyển hoặc tương tự trên mảng 2 chiều như vậy các em có thể tư duy
tương tự.
Link bài: SPOJ – Bài: QBMAX; NTU – bài: GIAN
3. Bài toán Tam giác số

Tính tổng lớn nhất trên đường đi từ đỉnh xuống đáy của tam giác. Với mỗi bước đi có thể đi chép
sang trái hoặc chéo sang phải.
Nếu nhìn tam giác số trên theo mảng 2 chiều các em sẽ dễ nhìn hơn:
7
3 5
8 1 0
2 7 4 4
4 5 2 6 5
Giáo viên: Lê Thanh Phú 2|Trang Phuleethanh@gmail.com
Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao
Vậy sẽ quy về giống bài toán con kiến: Đi từ ô (1,1) xuống đáy.
L[i,j] = C[i,j] + Max( C[i-1,j-1], C[i-1,j] ).
Kết quả tổng lớn nhất sẽ là Max của dòng cuối cùng m.
Nếu yêu cầu kết quả cần có thêm đường đi đã qua những ô nào (7 3 8 7 5) thì các em có thể try
vết dựa vào bảng phương án L.

Hình 2: Bảng C Hình 3: Bảng L

4. Bài toán Ckn


Tính Ckn .
Chúng ta đã biết các công thức sau:
Ck n = 1 (Với k=0 hoặc k=n)
k k k-1
C n = C n-1 + C n-1 (Với 0<k<n)
Các em có thể viết chương trình con đệ quy để tính C kn nhưng hiệu quả không cao vì thời gian
thực hiện sẽ rất lớn.
Áp dụng QHĐ: Ta xây dựng bảng phương án C để lưu.
0 1 2 .. n
0 1
1 1 1
2 1 2 1
..
k C(k,n)
Vậy thì ta có công thức tính bảng C:
 Ban đầu C(i,j) = 0
 C[0,i] = 1
 C[i,j] = C[i,j-1] + C[i-1,j-1]
Kết quả của bài toán sẽ là C[k,n]
5. Bắc cầu (Tương tự bài xâu con chung)
Hai nước Anpha và Beta nằm ở hai bên bờ sông Omega, Anpha nằm ở bờ bắc và có M thành phố
được đánh số từ 1 đến m, Beta nằm ở bờ nam và có N thành phố được đánh số từ 1 đến n (theo vị trí từ
đông sang tây).
Mỗi thành phố của nước này thường có quan hệ kết nghĩa với một số thành phố của nước kia.
Để tăng cường tình hữu nghị, hai nước muốn xây các cây cầu bắc qua sông, mỗi cây cầu sẽ là nhịp cầu
nối 2 thành phố kết nghĩa. Với yêu cầu là các cây cầu không được cắt nhau và mỗi thành phố chỉ là đầu
cầu cho nhiều nhất là một cây cầu, hãy chỉ ra cách bắc cầu được nhiều cầu nhất.
Hướng dẫn: Gọi các thành phố của Anpha lần lượt là a1,a2,…am; các thành phố của Beta là b1,b2,...bn.
Nếu thành phố ai và bj kết nghĩa với nhau thì coi ai “bằng” bj. Để các cây cầu không cắt nhau, nếu ta
đã chọn cặp thành phố (ai,bj) để xây cầu thì cặp tiếp theo phải là cặp

Giáo viên: Lê Thanh Phú 3|Trang Phuleethanh@gmail.com


Tài liệu bồi dưỡng học sinh giỏi THPT – Môn Tin học Phần II: Chuyên đề nâng cao
(au,bv) sao cho u>i và v>j. Như vậy các cặp thành phố được chọn xây cầu có thể coi là một dãy con chung
của hai dãy a và b.
Bài toán của chúng ta trở thành bài toán tìm dãy con chung dài nhất, ở đây hai phần tử “bằng”
nhau nếu chúng có quan hệ kết nghĩa.
6. Tìm xâu palindrome dài nhất của một xâu
Xâu con của một xâu S đã cho là một xâu gồm các kí tự liên tiếp hoặc không liên tiếp. Em hãy lập
trình tìm xâu con là xâu Palindrome dài nhất của một xâu S đã cho.
NKPalin.inp NKPalin.out
Lmevxeyzl level

Ý tưởng giải: Gọi xâu R là xâu đảo ngược của xâu đã cho. Khi đó ta có xâu con chung của xâu S và
xâu đảo R chính là xâu Palindrome dài nhất.
Vậy để giải quyết bài toán này ta có thể sử dụng bài Xâu con chung dài nhất của xâu S và xâu đảo
của S.
Link Test: SPOJ – Bài: PalinY

Giáo viên: Lê Thanh Phú 4|Trang Phuleethanh@gmail.com

You might also like