Tải bản đầy đủ (.doc) (20 trang)

skkn sử dụng phương pháp quy hoạch động trong bồi dưỡng HSG cấp tỉnh môn tin học

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (122.89 KB, 20 trang )

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ

TRƯỜNG THPT CHUYÊN LAM SƠN

SÁNG KIẾN KINH NGHIỆM

SỬ DỤNG PHƯƠNG PHÁP QUY HOẠCH ĐỘNG TRONG
BỒI DƯỠNG HSG CẤP TỈNH MÔN TIN HỌC

Người thực hiện: Nguyễn Thị Huyền
Chức vụ: Giáo viên
SKKN thuộc môn:Tin học

THANH HÓA NĂM 2016


MỤC LỤC

I. Mở đầu
1. Lý do chọn đề tài
2. Mục đích nghiên cứu.
II. Nội dung
1. Cơ sở lý luận
2. Một số bài toán quy hoạch động điển hình.
a. Dãy con đơn điệu dài nhất.
b. Vali (B)

Trang
1
1
2


2
2
6
6
8
10

c. Biến đổi xâu
3. Một số ví dụ cụ thể
a. Bài toán 1: Tính hệ số nhị thức

13
13

b. Bài toán 2: Số Fibonacci

14

c. Bài toán 3: Mật khẩu (Đề thi HSG cấp tỉnh năm học 2015- 16
2016-tỉnh Thanh Hóa)
d. Bài toán 4:Dãy con (Đề thi HSG cấp tỉnh năm học 2015-2016, 17
tỉnh Thanh Hóa)
18
IV. Kết luận và đề xuất.

2


I. Mở đầu
1. Lý do chọn đề tài

Môt trong cac muc tiêu khi đưa Tin hoc vao trương hoc la nhăm giup cho
hoc sinh có khả năng phân tich, tông hơp, trưu tương hóa, khai quat hóa vân đề va
đăc biêt la phat triên tư duy. Muốn vậy ngoai dạy đại tra Tin hoc trong nha trương
nhăm đảm bảo tinh phô thông, hướng nghiêp va dạy nghề thì cần phải tạo điều kiên
cho những hoc sinh có năng khiếu tin hoc đươc phat triên về khả năng lập trình va
giải quyết cac bai toan. Đê đap ứng yêu cầu nay cần phải cung câp cho hoc sinh
những kiến thức về thuật toan va cac phương phap thiết kết thuật toan.
Thuật toan (Algorithm) la môt trong những khai niêm quan trong trong tin
hoc. Có thê định nghĩa không hình thức về thuật toan như sau: Thuật toan la môt
dãy hữu hạn cac bước, mỗi bước mô tả chinh xac cac phép toan hoăc hanh đông
cần thực hiên đê giải quyết môt vân đề.
Măc dù không tồn tại môt phương phap vạn năng có thê giup ta thiết kế đươc
thuật toan giải quyết moi vân đề, nhưng cac nha nghiên cứu đã tìm ra môt số
phương phap thiết kế thuật toan cơ bản, cac phương phap nay goi la chiến lươc
thiết kế thuật toan. Mỗi phương phap nay có thê ap dung đê giải quyết môt phạm vi
kha rông cac bai toan.
Các phương pháp chung
Kỹ thuật Top-Down: La kỹ thuật tư trên xuống giải cac bai toan con nhận
đươc trong qua trình chia nhỏ môt cach đôc lập rồi kết hơp nghiêm của bai toan con
ta nhận đươc nghiêm của bai toan lớn. Tuy nhiên qua trình phân chia ta găp rât
nhiều lần cùng môt bai toan con. Giải quyết băng kỹ thuật trên ta phải tinh lại nhiều
lần cùng môt bai toan. Kỹ thuật nhận đươc sẽ kém hiêu quả.
Kỹ thuật Bottom-Up: La kỹ thuật tư dưới lên. Xuât phat tư những trương
hơp riêng đơn giản của bai toan thương la thây nghiêm của chung. Sau đó kết hơp
nghiêm của chung ta đươc những bai toan cỡ lớn hơn. Rồi lại kết hơp nghiêm của
bai toan ta đươc bai toan con cỡ lớn hơn nữa va tiếp tuc cho đến khi nhận đươc
nghiêm của bai toan đã cho.
Phương pháp riêng
Chia đê trị (divide-and-conquer), phương phap tham ăn (Greedy-methor),
Quay lui(Backtracking), quy hoạch đông (dynamic programing), nhanh va cận

(branch-and-bound)
Trong chương trình giảng dạy đại tra môn tin hoc ở trương THPT, phần thuật
toan đã đươc đưa vao giảng dạy ở lớp 10 với tông số tiết la 10. Với thơi lương hoc
như thế hoc sinh có thê biết đươc khai niêm về thật toan, môt số thuật toan giải cac
bai toan đơn giản. Tuy nhiên đối với những hoc sinh tham gia thi hoc sinh giỏi câp
tỉnh thì lương kiến thức về thuật toan như thế la không đủ va cần phải cung câp
3


thêm cac phương phap về thiết kế thuật toan. Vì vậy đây la lý do tôi chon đề tai “Sư
dung phương phap quy hoạch đông trong bồi dưỡng hoc sinh giỏi câp tỉnh môn Tin
hoc.”
2. Mục đích nghiên cứu.
Thông qua đề tai cung câp thêm môt phương phap tư duy, tiếp cận đê giải
cac bai toan trong bồi dưỡng HSG câp tỉnh.
Đưa ra những bai toan quy hoạch đông điên hình đã tưng xuât hiên trong cac
kỳ thi HSG câp tỉnh.

4


II. Nội dung
1. Cơ sở lý luận
a. Phương pháp quy hoạch động
Tư tưởng của phương pháp
Phương phap qui hoạch đông cùng nguyên lý tối ưu đươc R.Bellman đề xuât
vao những năm 50 của thế kỷ 20. Phương phap nay đươc ap dung đê giải môt số
bai toan như tô chức sản xuât, kế hoạch hóa kinh tế…
Trong nganh khoa hoc may tinh, quy hoạch đông la môt phương phap giảm
thơi gian chạy của cac thuật toan thê hiên cac tinh chât của cac bai toan con gối

nhau (overlapping substructure) va câu truc con tối ưu (optimail substructure)
Câu truc con tối ưu có nghĩa la cac lơi giải tối ưu cho cac bai toan con có thê
đươc sư dung đê tìm cac lơi giải tối ưu cho cac bai toan toan cuc. Có thê giải môt
bai toan với câu truc con tối ưu băng môt quy trình ba bước:
Bước 1: Chia bai toan thanh cac bai toan con nhỏ hơn.
Bước 2: Giải cac bai toan nay môt cac tối ưu băng cach sư dung đê quy quy
trình ba bước nay.
Bước 3: Sư dung cac kết quả tối ưu đê xây dựng môt lơi giải tối ưu cho bai
toan ban đầu.
Cac bai toan con đươc giải băng cach chia chung thanh cac bai toan nhỏ hơn,
va cứ tiếp tuc như thế, cho đến khi ta đến đươc trương hơp đơn giản dễ tìm lơi giải.
Nói răng môt bai toan có cac bai toan con trùng nhau nghĩa la môt bai toan
con đó đươc sư dung đê giải nhiều bai toan lớn hơn khac nhau. Vi du trong dãy
Fibonacci, F3=F1+F2 va F4=F2+F3 khi tinh mỗi số đều phải tinh F2. Vì tinh F5 cần
đến cả F3 va F4. Như vậy tinh F5 có thê tinh F2 hai lần hoăc nhiều hơn. Điều nay ap
dung mỗi khi có cac bai toan con gối nhau: môt cach tiếp cận ngây thơ có thê tốn
thơi gian tinh toan lại lơi giải tối ưu cho cac bai toan con ma nó đã giải.
Đê tranh viêc đó, ta lưu trữ lơi giải của cac bai toan con đã giải. Do vậy nếu
sau nay ta cần giải lại chinh bai toan đó, ta có thê lây va sư dung kết quả đã đươc
tinh toan. Hướng tiếp cận nay đươc goi la lưu trữ. Nếu ta chắc chắn môt lơi giải nao
đó không còn cần thiết nữa, ta có thê xóa nó đi đê tiết kiêm không gian bô nhớ.
Trong môt số trương hơp, ta còn có thê tinh lơi giải cho cac bai toan con ma ta biết
trước răng sẽ cần đến.
Quy hoạch đông la kỹ thuật tư dưới lên (Bottom-Up). Chung ta xuât phat tư
những trương hơp riêng đơn giản nhât thương la thây nghiêm ngay của của chung.
Sau đó kết hơp nghiêm của chung ta đươc nghiêm của bai toan con cỡ lớn hơn. Rồi
lại kết hơp nghiêm của cac bai toan con nay đê nhận đươc nghiêm của bai toan lớn
5



hơn nữa, va cứ tiếp tuc cho đến khi nhận đươc nghiêm của bai toan đã cho. Như
vậy tư tưởng cơ bản của phương phap quy hoạch đông la qua trình đi tư dưới lên,
qua trình nay ta sư dung môt bản đê lưu trữ lơi giải của bai toan con đã giải. Khi
giải môt bai toan con cần đến nghiêm của bai toan cỡ nhỏ hơn ta chỉ cần tìm trong
bảng không phải giải lại. Như vậy nguyên lý “chia đê trị” đươc đẩy tới cao đô ở
đây.
b. Các bước thực hiện quy hoạch động.
* Bài toán tối ưu.
Trong thực tế ta thương găp môt số bai toan tối ưu loại sau: Có môt đại
lương f hình thanh trong môt qua trình gồm nhiều giai đoạn ma ta chỉ quan tâm đến
kết quả cuối cùng la trị của f phải lớn nhât hoăc nhỏ nhât. Ta goi chung la gia trị tối
ưu của f. Gia trị của f phu thuôc vao những đại lương xuât hiên trong bai toan ma
mỗi bô gia trị của chung đươc goi la trạng thai của hê thống va cũng phu thuôc vao
cach thức đạt đươc giai trị f trong tưng giai đoạn ma mỗi cach thức đươc goi la môt
điều khiên. Đại lương f thương đươc goi la ham muc tiêu va qua trình đạt đươc gia
trị tối ưu của f đươc goi la qua trình điều khiên tối ưu.
Ý tưởng cơ bản của nguyên lý tối ưu do R. Bellman đề xuât như sau: Với
mỗi qua trình điều khiên tối ưu, đối với trạng thai bắt đầu A 0, với moi trạng thai A
trong qua trình đó, phần qua trình kê tư trạng thai xem như trạng thai bắt đầu cũng
la tối ưu.
Phương phap tìm điều khiên tối ưu theo nguyên lý Bellman thương đươc goi
la quy hoạch đông.
* Các bước thực hiện quy hoạch động.
Bước 1: Lập hê thức
Dựa vao nguyên lý tối ưu tìm cach chia qua trình giải bai toan thanh tưng
giai đoạn, sau đó tìm hê thức biêu diễn tương quan quyết định của bước đang xư lý
với cac bước đã xư lý trước đó. Hoăc tìm cach phân rã bai toan thanh cac bai toan
con tương tự có kich thước nhỏ hơn, tìm hê thức nêu quan hê giữa kết quả bai toan
kich thước đã cho với cac kết quả của cac bai toan con cùng kiêu có kich thước nhỏ
hơn của nó nhăm xây dựng phương trình truy toan (dạng ham hoăc thủ tuc đê quy).

Cach xây dựng phương trình truy toan:
Chia viêc giải bai toan thanh n giai đoạn. Mỗi giai đoạn i có trạng thai ban đầu
la t(i) va chịu tac đông đều khiên la d(i) sẽ biến trạng thai tiếp theo t(i+1) của giai đoạn
i+1 (i=1,2,…n-1). Theo nguyên lý tối ưu của Bellman thì viêc tối ưu giai đoạn cuối
cùng không lam ảnh hưởng đến kết quả toan bai toan. Với trạng thai ban đầu la t(n),
sau khi lam giai đoạn n tốt nhât ta có trạng thai của giai đoạn n-1 la t(n-1) va tac đông
điều khiên của giai đoạn n-1 la d(n-1), có thê tiếp tuc xét đến giai đoạn n-1. Sau khi tối
ưu giai đoạn n-1 ta lại có t(n-2) va d(n-2) va có thê tối ưu giai đoạn n-2…cho đến khi
6


cac giai đoạn tư n giảm đến 1 đươc tối ưu thì coi như hoan thanh bai toan. Go i gia trị
tối ưu của bai toan tinh đến giai đoạn k la F k, gia trị tối ưu của bai toan tinh riêng ở
giai đoạn k la Gk thì Fk=Fk-1+Gk hay :

Fk(t(k))=max{Gk(t(k),d(k))+Fk-1(t(k-1))} (*)
∀d

Bước 2: Tô chức dữ liêu va chương trình
Cac gia trị của Fk trương đươc lưu trữ trong môt bảng (mảng môt chiều hoăc
hai, ba chiều…)
Cần lưu ý khởi tạo cac gia trị ban đầucủa bảng cho thich hơp, đó la cac kết
quả của bai toan con có kich thước nhỏ nhât của bai toan đang giải.
F1(t(1))= max{G1(t(1),d(1))+F0(t(0))}
∀d

Dựa vao phương trình truy toan (*) va cac giai trị đã có trong bảng đê tìm
dần cac gia trị còn lại của bảng.
Ngoai ra còn cần mảng lưu trữ nghiêm tương ứng với giai trị tối ưu trong
tưng giai đoạn.

Dựa vao bảng lưu trữ nghiêm va bảng gia trị tối ưu tưng giai đoạn đã xây
dựng, tìm ra kết quả bai toan.
Lưu ý: Lam tốt thuật toan băng cach thu gon hê thức (*) va giảm kich thước
miền nhớ. Thương tìm cach dùng mảng môt chiều thay cho mảng hai chiều nếu gia
trị môt dòng (hoăc côt) của mảng hai chiều chỉ phu thuôc môt dòng (hoăc côt) kề
trước.
c. Hạn chế của quy hoạch động
Viêc tìm công thức, phương trình truy toan hoăc tìm cach phân rã bai toan
nhiều khi đòi hỏi sự phân tich tông hơp rât công phu, dễ sai sót, khó nhận ra như
thế nao la thich hơp, đòi hỏi nhiều thơi gian suy nghĩ. Đồng thơi không phải luc
nao kết hơp lơi giải của cac bai toan con cũng cho kết quả của bai toan lớn hơn.
Số lương cac bai toan con cần giải quyết va lưu trữ kết quả có thê rât lớn,
không thê châp nhận đươc.
Không phải bai toan tối ưu nao cũng có thê giải băng phương phap qui hoạch
đông.

7


2. Một số bài toán quy hoạch động điển hình.
a. Dãy con đơn điệu dài nhất.
Mô hình
Cho dãy a1 ,a2,…an. Hãy tìm môt dãy con tăng có nhiều phần tư nhât của dãy.
Đăc trưng của bai toan nay la:
Cac phần tư trong dãy kết quả chỉ xuât hiên 1 lần. Vì vậy phương phap lam
la ta sẽ dùng vòng lăp For duyêt qua cac phần tư ai trong dãy, cac phần tư trong dãy
có thê đươc chon nhiều lần nên ta thực hiên băng phương phap cho gia trị cần quy
đôi tăng dần tưng đơn vị.
Thứ tự của cac phần tư đươc chon phải giữ nguyên so với dãy ban đầu.
Đăc trưng nay có thê mât đi trong môt số bai toan khac tùy vao yêu cầu cu

thê. Chẳng hạn bai Tam giac băng nhau.
Công thức QHĐ
Ham muc tiêu f=đô dai dãy con.
Vì đô dai dãy con chỉ phu thuôc vao 1 yếu tố la dãy ban đầu nên bảng
phương an la bảng môt chiều. Goi L(i) la đô dai dãy con tăng dai nhât, cac phần tư
lây trong miền tư a1 đến ai va phần tư cuối cùng la ai.
Nhận xét với cach lam nay ta đã chia 1 bai toan lớn (dãy con của n số) thanh
cac bai toan con cùng kiêu có kich thước nhỏ hơn (dãy con của dãy i số). Vân đề la
công thức truy hồi đê phối hơp kết quả của cac bai toan con.
Ta có công thức quy hoạch đông đê tinh L(i) như sau:
L(1)=1. (Hiên nhiên)
L(i)=Max(1, L(j)+1 với moi phần tư j: 0Tinh L(i): phần tư đang đươc xét la a i. Ta tìm đến phần tư ajnhât. Khi đó nếu bô sung ai vao sau dãy con…aj ta sẽ đươc dãy con tăng dần dai
nhât xét tư a1…ai.
Cài đặt
Bảng phương an la môt mảng môt chiều L đê lưu giữ cac gia trị của ham
QHĐ L(i). Đoạn chương trình tinh cac gia trị của mảng L như sau:
For i:=1 to n do
Begin
L[i]:=1;
For j:=1 to i-1 do
8


If (a[j]<=a[i]) and L[i]L[i]:=L[j]+1;
End;
Như vậy chi phi không gian của bai toan la O(n), chi phi thơi gian la O(n 2).
Có môt số phương phap cai đăt tốt hơn so với phương phap trên, cho chi phi thơi

gian la O(nlogn).
Một số bài toán biến thể.
Bai toan dãy con đơn điêu dai nhât có biến thê đơn giản nhât la bai toan dãy
con đơn điêu giảm dai nhât, tuy nhiên chung ta có thê coi chung như la môt. Sau
đây la môt số bai toan khac.
Bài toán 1: bố tri phòng hop (mât tinh thứ tự so với dãy ban đầu)
Có n cuôc hop, cuôc hop thứ i bắt đầu vao thơi điêm a i va kết thuc ở thơi
điêm bi. Do chỉ có môt phòng hôi thảo nên 2 cuôc hop bât kỳ sẽ cùng đươc bố tri
phuc vu nếu khoảng thơi gian lam viêc của chung chỉ giao nhau tại đầu mut. Hãy
bố tri phòng hop đê phuc vu đươc nhiều cuôc hop nhât.
Hướng dẫn: sắp xếp cac cuôc hop tăng dần theo thơi điêm kết thuc b i. Cuôc
hop i sẽ bố tri đươc sau cuôc hop j nếu va chỉ nếu jnhiều cuôc hop nhât có thê đưa về viêc tìm dãy cac cuôc hop dai nhât thỏa mãn
điều kiên trên.
Bài toán 2: Cho thuê may
Trung tâm tinh toan hiêu năng cao nhận đươc đơn đăt hang của n khach
hang. Khach hang i muốn dư dung may trong khoảng thơi gian tư a i đến bi va trả
tiền thuê la ci. Hãy bố tri lịch thuê may đê tông số tiền thu đươc la lớn nhât ma thơi
gian sư dung may của hai khach hang bât kỳ đươc phuc vu đều không giao nhau (cả
trung tâm chỉ có môt may cho thuê).
Tương tự như bai toan 1 nếu sắp xếp cac đơn hang theo thơi điêm kết thuc, ta
sẽ đưa đươc bai toan 2 về bai toan tìm dãy con có tông lớn nhât. Bai toan nay la
biến thê của bai toan tìm dãy con tăng dai nhât, ta có thê cai đăt băng đoạn chương
trình sau:
For i:=1 to n do
Begin
L[i]:=c[i];
For j:=1 to i-1 do
If (b[j]<=a[i]) and L[i]L[i]:=L[j]+c[i];

End;
9


Bài toán 3: Dãy tam giac bao nhau
Cho n tam giac trên măt phẳng. Tam giac i bao tam giac j nếu 3 đỉnh của tam
giac j đều năm trong tam giac i (có thê năm trên cạnh). Hãy tìm dãy tam giac bao
nhau có nhiều tam giac nhât.
Hướng dẫn: sắp xếp cac tam giac tăng dần về diên tich. Khi đó tam giac i sẽ
bao tam giac j nếu jdãy tăng dai nhât.
Viêc kiêm tra điêm M có năm trong tam giac ABC không có thê dựa trên
phương phap tinh diên tich: Điêm M năm trong tam giac nếu S(ABC)=S(ABM)
+S(ACM)+S(BCM). Bai toan có môt số biến thê khac như tìm dãy hình tam giac,
hình chữ nhật… bao nhau có tông diên tich lớn nhât.
Bài toán 4: Dãy WAVIO
Dãy số WAVIO la dãy số nguyên thỏa mãn cac tinh chât: cac phần tư đầu sắp
xếp thanh môt dãy tăng dần đến môt phần tư đỉnh sau đó giảm dần. Vi du dãy số 1
2 3 4 5 2 1 la môt dãy WAVIO có đô dai 7. Cho môt dãy gồm N số nguyên, hãy chỉ
ra môt dãy con WAVIO có đô dai lớn nhât trich ra tư dãy đó.
Hướng dẫn: L1[i] la mảng ghi đô dai lớn nhât của môt dãy con tăng dần trich
ra tư dãy N phần tư kê tư phần tư 1 đến phần tư ai.
L2[i]: mảng ghi đô dai lớn nhât của dãy con giảm dần trich ra tư dãy N phần
tư kê tư phần phần tư aN đến ai. Ta tìm phần tư j trong 2 mảng L 1, L2 thỏa mãn L1[j]
+L2[j] lớn nhât.
b. Vali (B)
Mô hình
Có n đồ vật, vật thứ i có trong lương a i va gia trị bi. Hãy chon ra môt số cac
đồ vật, mỗi vật môt cai đê xếp vao môt va li có trong lương tối đa W sao cho tông
cac gia trị của vali la lớn nhât.

Công thức
Ham muc tiêu f: tông gia trị của vali.
Nhận xét: gia trị của vali phu thuôc vao 2 yếu tố: Có bao nhiêu vật đang xét
va trong lương của cac vật. Do đó bảng phương an sẽ la mảng hai chiều.
L[i,j]: Tông gia trị lớn nhât của vali khi xét tư vật 1đến vật i va trong lương
của vali chưa vươt qua j. Chu ý răng khi xét đến L[i,j] thì cac gia trị trên bảng
phương an đều đã đươc tối ưu.
Tinh L[i,j]: vật đang xét la ai với trong lương của vali không vươt qua j. Có 2
khả năng xảy ra:
10


Nếu chon ai đưa vao vali, trong lương vali trước đó phải nhỏ hơn hoăc băng
j-a[i]. Vì mỗi vật chỉ đươc chon 1 lần nên gia trị lớn nhât của vali luc đó la L[i-1,ja[i])+b[i].
Nếu không chon ai, trong lương của vali la như cũ (như luc trước khi chon
ai): L[i,j]
Ta có L[i,j]=max(L[i-1,j-a[i]],+b[i],L[i-1,j]).
Cài đặt
For i:=1 to n do
For j:=1 to W do
If (b[j]<=j then
L[i,j]:= max(L[i-1,j-a[i]],+b[i],L[i-1,j])
Else L[i,j]:=L[i-1,j];
Một số bài toán biến thể.
Bài toán 1:Dãy con có tổng bằng S.
Cho dãy a1 ,a2,…an.Tìm môt dãy con của dãy đó có tông băng S.
Hướng dẫn
Đăt L[i,t]=1 nếu có thê tạo ra tông t tư môt dãy con của dãy gồm cac phần tư
a1 ,a2,…ai. ngươc lại thì L[i,t]=0. Nếu L[n,S]=1 thì đap an của bai toan la có. Ta có
thê tinh L[i,t] theo công thức L[i,t]=1 nếu L[i,t]=1 hoăc L[i-1,t-a[i]=1

Cài đặt
Nếu ap dung công thức trên thì ta cần dùng bảng phương an hai chiều. Ta có
nhận xét răng đê tinh dòng thứ i, ta chỉ cần dòng i-1. Bảng phương an khi đó chỉ
cần môt mảng môt chiều L[0..S] va đươc tinh như sau:
L[t]:=0; L[0]:=1;
For i:=1 to ndo
For t:=S downto a[i] do
If (L[t]=0) and L[t-a[i]=1 then L[t]:=1
Dễ thây chi phi không gian của cach cai đăt trên la O(m), chi phi thơi gian la
O(m.n), với m la tông của n số.
Bài toán 2: Chia kẹo
Cho n gói kẹo, gói thứ i có ai viên. Hãy chia cac gói thanh i phần sao cho
chênh lênh giữa hai phần la it nhât.

11


Hướng dẫn: Goi T la tông số kẹo của n gói. Chung ta cần tìm số S lớn nhât
thỏa mãn:
S≤T/2 va có môt dãy con của dãy a có tông băng S.
Khi đó sẽ có cach chia với chênh lênh 2 phần la T-2S la nhỏ nhât va dãy con
có tông băng S ở trên gồm cac phần tư la cac gói kẹo thuôc phần thứ nhât. Phần
thứ hai la cac gói kẹo còn lại.
Bài toán 3: Điền dấu
Cho n số tự nhiên a1 ,a2,…an. Ban đầu cac số đươc đăt liên tiếp theo đung thứ
tự cach nhau bởi dâu ?: a1?a2?…?an. Cho trước số nguyên S, có cach nao thay cac
dâu ? băng dâu + hay dâu – đê đươc môt biêu thức số hoc có gia trị la S không.
Hướng dẫn: Đăt L(i,t)=1 nếu có thê điền dâu vao i số đầu tiên va cho kết quả
băng t. Ta có công thức sau đê tinh L:
L(1,a[1])=1

L(i,t)=1 nếu L(i-1, t+a[i])=1 hoăc L[i-1,t-a[i])=1.
Nếu L(n,S)=1thì đap an của bai toan la có. Khi cai đăt có thê dùng môt mảng
hai chiều (lưu toan bô bảng phương an) hoăc hai mảng môt chiều (đê lưu dòng i va
dòng i-1). Chu ý la chỉ số theo t của mảng phải có cả phần âm (tức la tư -T đến T,
với T la tông của n số), vì trong nay dùng dâu – nên có thê tạo ra cac tông âm. Bai
nay có môt biến thê va đăt dâu sao cho kết quả la môt số chia hết cho k. Ta có thuật
giải tương tự như bai toan trên băng cach thay cac phép công, trư băng cac phép
công, trư theo môđun k va dùng mảng đanh dâu với cac gia trị tư 0 đến k-1(la cac
số dư có thê có khi chia cho k). Đap an của bai toan la L(n,0).
c. Biến đổi xâu
Mô hình
Cho hai xâu X,F. Xâu nguồn có n ki tự X 1 X2…Xn. Xâu đich có m ki tự
F1F2…Fm. Có 3 phép biến đôi
- Chèn môt ki tự vao sau ki tự thứ i: I i C
- Thay thế ki tự ở vị tri i băng ki tự C: R iC.
- Xóa ki tự ở vị tri thứ i: D i
Hãy tìm số it nhât cac phép biến đôi đê biến xâu X thanh xâu F
Hướng dẫn:
Ham muc tiêu f: số phép biến đôi
Dễ thây số phép biến đôi phu thuôc vao vị tri i đang xét của xâu X va vị tri j
đang xét của xâu F. Do vậy đê cai đăt cho bảng phương an ta sẽ dùng mảng hai
chiều
12


Goi L(i,j) la số phép biến đôi it nhât đê biến xâu X(i) gồm i ki tự phần đầu
của X (X(i)=X[1..i]) thanh xâu F(j) gồm j ki tự phần đầu của F (F(j)=F[1..j]). Dễ
thây F(0,j)=j va F(i,0) =i
Có hai trương hơp xảy ra
Nếu X[i]=F[j] thì hai xâu trên có dạng X1 X2…Xi-1Xi va F1F2…Fj-1Xi. Luc

nay chỉ phải biến đôi xâu X(i-1) thanh xâu Y(j-1). Do đó F(i,j)=F(i-1,j-1). Ngươc
lại ta có 3 cach biến đôi:
C1: Xóa ki tự X[i] khi đó hai xâu trên có dạng X 1 X2…Xi-1Xi va F1F2…Fj-1Xj.
Xâu X(i-1) thanh F(j). Khi đó F(i,j)=F(i-1,j)+1 (công 1 la do ta dùng 1 phép xóa).
C2:Thay thế X[i] bởi F[j] khi đó hai xâu trên có dạng X 1 X2…Xi-1Fj va
F1F2…Fj-1Fj. Xâu X(i) thanh F(j-1). Khi đó F(i,j)=F(i-1,j-1)+1
C3: Chèn F(j) vao X(i) khi đo hai xâu trên có dạng X 1 X2…Xi-1 Xi Fj va
F1F2…Fj-1Fj.Xâu X(i) thanh F(j-1). Khi đó F(i,j)=F(i,j-1)+1;
Như vậy ta có công thức QHĐ:
F(0,j)=j
F(i,0)=i
F(i,j)=F(i-1,j-1) Nếu X[i]=F[j]
F(i,j)=min(F(i-1,j), F(i,j-1), F(i-1,j-1))+1 nếu X[i]≠F[j]
Bai nay ta có thê dùng 2 mảng 1 chiều tinh lẫn nhau va môt mảng đanh dâu 2
chiều đê truy vết.
Một số bài toán biến thể.
Bài toán 1: Xâu con chung dai nhât
Cho hai xâu X,Y. Hãy tìm xâu con của X va Y có đô dai lớn nhât.
Công thức QHĐ
Goi L(i,j) la đô dai xâu con chung dai nhât của xâu X(i) gồm i ki tự phần đầu
của X (X(i)=X[1..i]) va xâu Y(j) gồm j ki tự phần đầu của Y (Y(j)=Y[1..j]
Ta có công thức QHĐ như sau:
L(0,j)=L(i,0)=0
L(i,j)=L(i-1,j-1)+1 Nếu X[i]=Y[j]
L(i,j)=max(L(i-1,j), F(i,j-1)) nếu X[i]≠Y[j]
Cai đăt: Bảng phương an la môt mảng hai chiều L[0..m,0..n] đê lưu cac gia
trị của ham QHĐ L(i,j). Đoạn chương trình cai đăt công thức QHĐ trên như sau:
For i:=0 to m do L[i,0]:=0;
13



For j:=0 to n do L[0,j]:=0;
For i:=1 to m do
For j:=1 to n do
If X[i]=Y[j] then L[i,j]:=L[i-1,j-1]+1
Else L[i,j]:=max(L[i-1,j],L[i,j-1]]);
Như vậy chi phi không gian của bai toan la O(n2), Chi phi thơi gian la O(n2).
Có phương an cai đăt tốt hơn, chỉ với chi phi không gian O(n) dựa trên nhận
xét sau: đê tinh ô L[i,j] của bảng phương an, ta chỉ cần 3 ô L[i-1,j-1], L[i-1,j] va
L[i,j-1]. Tức la đê tinh dòng L[i] thì chỉ cần dòng L[i-1]. Do đó ta chỉ cần 2 mảng 1
chiều đê lưu dòng vưa tinh (P) va dòng đang tinh (L) ma thôi. Cach cai đăt mới như
sau:
For j:=0 to n do P[j]:=0;
For i:=1 to m do
begin
L[0]:=0;
For j:=1 to n do
If X[i]=Y[j] then L[i]:=P[j-1]+1
Else L[i]:=max(P[j],L[j-1]);
P:=L;
End;
Bài toán 2: Palindrom
Môt xâu goi la xâu đối xứng (Palindrom) nếu xâu đó đoc tư trai sang phải
hay tư phải sang trai đều như nhau. Cho môt xâu S, hãy tìm số ki tự it nhât cần
thêm vao S đê S thanh xâu đối xứng.
Hướng dẫn: Bai toan nay có môt công thức QHĐ như sau:
Goi L(i,j) la số ki tự it nhât cần thêm vao xâu con S[i..j] của S đê xâu đó trở
thanh đối xứng.
Đap số của bai toan sẽ la L(1,n) với n la số ki tự của S. Ta có công thức sau
đê tinh L(i,j);

L(i,i) = 0;
L(i,j)= L(i+1, j-1) nếu S(i)=S(j)
L(i,j)= max(L(i+1, j), L(i, j-1)) nếu S(i)≠S(j)
14


Ta có thê cai đăt trực tiếp công thức đó băng phương phap đê quy có nhớ, tuy
nhiên khi đó chi phi không gian la O(n2)
Ta có thuật toan đơn giản như sau:
Goi P la xâu đảo của S va T la xâu con chung dai nhât của S va P. Khi đó cac
ki tự của S không thuôc T cũng la cac ki tự cần thêm vao đê S trở thanh đối xứng.
Đap số của bai toan sẽ la n-k với k la đô dai của T.
Vi du: S = edbabcd, xâu đảo của S la P=dcbabde. Xâu con chung dai nhât
của S va P la T=dbabd. Như vậy cần thêm 2 ki tự la e va c vao đê S trở thanh xâu
đối xứng.
3. Một số ví dụ cụ thể
a. Bài toán 1: Tính hệ số nhị thức
Số tô hơp chập k của n(ki hiêu la C[k,n]) la số cach chon k phần tư khac
nhau tư môt tập n phần tư. Cac số tô hơp còn đươc goi la hê số nhị thức. Cac hê số
nhị thức có rât nhiều ứng dung trong toan hoc va thương đươc sư dung đê phân tich
va đanh gia thuật toan.
Diễn đạt bài toán thành hai phần
Input: k, n
Output: Số cach chon k phần tư tư n phần tư (C[k,n]).
Thuật toán: Công thức tinh C[k,n] thông qua C[k-1,n-1] va C[k,n-1]

C[i,j]=1 Nếu i=0 hoăc i=j
C[i,j]= C[i-1,j-1] + C[i,j-1]
Tinh hê số nhị thức trực tiếp bởi ham đê quy
Function C(k,n:integer): integer;

Begin
If(k=0) or (k=n) then C:=1
Else C:= C[k,n-1] + C[k-1,n-1]
End;
Đanh gia: Đê tinh C(k,n) rât nhiều gia trị C(i,j) (với idu: Tinh C(3,5) thì phải tinh 2 lần C(2,3), 3 lần C(1,2)…như vậy thơi gian tinh sẽ
rât lớn va không phù hơp với dữ liêu đầu vao lớn.
Tinh hê số nhị thức băng phương phap QHĐ.
Xuât phat trương hơp đơn giản nhât C[0,j]=1 với j≤n
Công thức tinh C[k,n] thông qua C[k-1,n-1] va C[k,n-1]
15


C[i,j]=1 Nếu i=0 hoăc i=j
Tạo bảng đê lưu nghiêm bai toan con
Mảng C[0..k, 0..n] lưu cac gia trị của C[i,j] (0≤i≤k, 0≤i≤n )
Tinh nghiêm của bai toan theo công thức va lưu vao C[i,j]
Kết quả nghiêm của bai toan la C[n,k]
Vi du minh hoa
Tinh tô hơp chập 5 của 10 (C[5,10], k=5, n=10)
Sư dung thuật toan trên ta xây dựng đươc bảng lưu kết quả C[k,n]
0

1

1

1

1


1

1

1

1

1

1

0

1

2

3

4

5

6

7

8


9

10

0

0

1

3

6

10

15

21

28

36

45

0

0


0

1

4

10

20

35

56

84

120

0

0

0

0

1

5


15

35

70

126

210

0

0

0

0

0

1

6

21

56

126


252

Vậy C[5,10]=252
Cài đặt chương trình
(phu luc)
b. Bài toán 2: Số Fibonacci
Số Fibonacci đươc xac định bởi công thức
F0=0
F1=1
Fn=Fn-1+Fn-2 với n ≥ 2
Hãy xac định số Fibonacci thứ n
Cach 1: dựa vao phương phap chia đê trị ta tinh Fn dựa vao Fn-1 va Fn-2
Function F(n:longint):int64;
begin
if n<=1 then F:=n
else F:=F(i-1)+F(i-2);
end;
16


BEGIN
readln(n);
Writeln(F(n));
End;
Ham đê quy đê tinh số Fibonacci thứ n
Cach 2: phương phap quy hoạch đông
Ta sư dung mảng S[0..maxN], S[i] đê lưu lại lơi giải cho bai toan tinh số
Fibonacci thứ i
Const MaxN =50;

Var S :array[0..MaxN]of int64;
n,k :longint;
function F(n:longint):int64;
begin
if S[n]=-1 then
begin
{bài toán chưa được giải thì sẽ tiến hành giải}
If n<=1 then S[n]:=n
Else S[n]:=F(n-1)+F(n-2);
end;
{nếu bài toán đã được giải thì không cần giải nữa mà lấy luôn kết quả}
F:=S[n];
end;
BEGIN
readln(n);
for k:=0 to MaxN do S[k]:=-1;
writeln(F(n));
END.

c. Bài toán 3: Mật khẩu (Đề thi HSG cấp tỉnh năm học 2015-2016-tỉnh
Thanh Hóa)
17


Cho xâu ký tự đươc goi la mật khẩu “an toan” nếu thỏa mãn cac điều kiên:
đô dai của xâu đó >=6 chứa it nhât môt chữ cai in hoa (‘A’..’Z’), chứa it nhât môt
chữ cai thương (‘a’..’z’), va chứa it nhât môt chữ số (‘0’..’9’).
Vi du ‘a1B2C3’, ‘tinHoc6’ la hai mật khẩu an toan, còn ‘a1B2c’, ‘a1b2c3’,
‘A1B2C3’ ‘tin hoc’ đều không phải la mật khẩu an toan. Cho môt xâu S ma mỗi ký
tự trong S thuôc môt trong 3 loại sau: chữ cai in hoa (‘A’..’Z’), chữ cai thương

(‘a’..’z’), chữ số (‘0’..’9’).Tìm xem có bao nhiêu căp chỉ số (i,j) thỏa mãn điều kiên
1<=ian toan.
Input:Cho trong file văn bản BAI2.INP gồm duy nhât môt dòng chứa xâu S
có đô dai không qua 5000 ki tự
Output: Kết quả ghi ra file văn bản BAI2.OUT môt số nguyên dương la số
lương căp chỉ số (i,j) tinh đươc.
Thuật toán:
Dùng 3 mảng ft,fh,fs đê lưu số lần xuât hiên cac chữ cai in thương, in hoa va
chữ số xuât hiên trong xâu S. Xâu an toan có it nhât la 6 ki tự nên căp chỉ số (i,j)
thỏa mãn i tư length(s)-5, va j tư i+1 đến length(s) va đồng thơi thỏa mãn:
(fs[j] - fs[i-1]) >=1,(fh[j] - fh[i-1]) >=1,(ft[j] - ft[i-1] >)=1.Tinh số lần xuât
hiên cac chữ cai in thương, in hoa va chữ số băng công thức quy hoạch đông :
for i:=1 to n do
if st[i] in ['A'..'Z'] then
begin
fh[i]:= fh[i-1]+1;
fs[i]:= fs[i-1];
ft[i]:= ft[i-1];
end
else
if st[i] in ['a'..'z'] then
begin
ft[i]:= ft[i-1] +1;
fs[i]:= fs[i-1];
fh[i] := fh[i-1];
end
else
begin
fs[i]:= fs[i-1] +1;

18


fh[i]:= fh[i-1];
ft[i]:= ft[i-1];
end;
Cài đặt
(phụ lục)
d. Bài toán 4: Dãy con (Đề thi HSG cấp tỉnh năm học 2015-2016, tỉnh
Thanh Hóa)
Cho môt dãy số nguyên dương gồm n phần tư a1 ,a2,…an va môt số nguyên
dương k.
Môt dãy thu đươc tư dãy ban đầu băng cach loại bỏ đi môt số phần tư va giữ
nguyên thứ tự cac phần tư còn lại (có thê không loại bỏ phần tư nao) đươc goi la dãy
con của dãy ban đầu. Hãy tìm dãy con của dãy đã cho có tông cac phần tư băng k.

Input:Cho trong file văn bản BAI3.INP gồm 2 dòng
• Dòng đầu ghi hai số nguyên N va k (0• Dòng tiếp theo ghi N số nguyên a1 ,a2,…an (0Output: Kết quả ghi ra file văn bản BAI3.OUT, có câu truc như sau:
• Nếu không có dãy con nao thỏa mãn đề bai thì ghi số 0.
• Nếu có tư 2 dãy con trở lên thỏa mãn đề bai thì ghi số lương dãy con thỏa
mãn.
• Nếu chỉ có môt dãy con thỏa mãn thì ghi cac phần tư của dãy con theo thứ tự
nhập vao của dãy số.
Thuật toán
Đây la bai toan thuôc dạng biến thê của bai toan quy hoạch đông điên hình
Vali(B), cai đăt bai toan nay chung ta dùng mảng môt chiều thay cho mảng hai
chiều đã nêu ở trên.
Cài đặt

(phu luc)

19


IV. Kết luận và đề xuất.
Phương phap quy đông la la môt trong những phương phap đươc sư dung đê
bồi dưỡng hoc sinh giỏi, đăc biêt la đối với hoc sinh giỏi câp quốc gia. Phương
phap nay không năm trong chương trình hoc phô thông, tuy nhiên cần thiết phải
đưa phương phap nay vao bồi dưỡng hoc sinh giỏi câp tỉnh, bởi lẽ phương phap nay
giup hoc sinh có năng khiếu tin hoc đươc phat triên về khả năng lập trình va giải
quyết cac bai toan trong tin hoc.
Đê giao viên không dạy chuyên tin đươc tiếp cận với phương phap nay, tôi
đề nghị với cac câp có thẩm quyền thương xuyên tô chức cac chuyên đề bồi dưỡng
hoc sinh giỏi cho giao viên Tin hoc trên toan tỉnh, đê chung tôi có cơ hôi đươc phat
triên khă năng va năng lực của mình.

XÁC NHẬN CỦA THỦ TRƯỞNG ĐƠN VỊ

Thanh Hóa, ngày 20 tháng 5 năm 2016
Tôi xin cam đoan SKKN nay không sao
sao chép nôi dung của ngươi khac.

Nguyễn Thị Huyền

20