Lý do chọn đề tài Hiện nay nhiệm vụ phát hiện, đào tạo và bồi dưỡng học sinh giỏi là một nhiệm vụ trọng tâm của các trường THPT Chuyên của tất cả các tỉnh thành trong cả nước, nhằm mục
Trang 1ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
THÁI PHONG NGHĨA
PHƯƠNG PHÁP QUY HOẠCH ĐỘNG VÀ VẬN DỤNG
KẾT HỢP GIẢI CÁC BÀI TOÁN CHUYÊN TIN BẬC THPT
Chuyên ngành: KHOA HỌC MÁY TÍNH
Mã số: 60.48.01
TÓM TẮT LUẬN VĂN THẠC SĨ KỸ THUẬT
Đà Nẵng – Năm 2018
Trang 2Công trình được hoàn thành tại TRƯỜNG ĐẠI HỌC BÁCH KHOA
Người hướng dẫn khoa học: PGS TSKH TRẦN QUỐC CHIẾN
Phản biện 1: TS ĐẶNG HOÀI PHƯƠNG
Phản biện 2: TS NGUYỄN THÁI SƠN
Luận văn sẽ được bảo vệ trước Hội đồng chấm Luận văn tốt nghiệp thạc sĩ Khoa học máy tính họp tại Trường Đại học Bách khoa vào
ngày 03 tháng 02 năm 2018
Có thể tìm hiểu luận văn tại:
Thư viện Khoa Công nghệ thông tin, Trường Đại học Bách khoa –
ĐHĐN
Trang 3MỞ ĐẦU
1 Lý do chọn đề tài
Hiện nay nhiệm vụ phát hiện, đào tạo và bồi dưỡng học sinh giỏi là một nhiệm vụ trọng tâm của các trường THPT Chuyên của tất
cả các tỉnh thành trong cả nước, nhằm mục đích phát hiện bồi dưỡng
và đào tạo nhân tài, tạo ra một đội ngũ học sinh chất lượng cao làm tiền đề để phát triển nâng cao hơn nữa ở bậc đại học, sau đại học cho các em học sinh Môn Tin học tự hào cũng là một môn học quan trọng không kém nên được đưa vào chương trình thi học sinh giỏi các cấp hằng năm như: thi học sinh giỏi cấp Tỉnh (thành phố), thi học sinh giỏi Olympic 30/04 (từ Đà Nẵng trở vào phía Nam), thi học sinh giỏi Quốc gia, bên cạnh đó còn có thi Tin học trẻ không chuyên (cấp Tỉnh và Toàn quốc)
Trong vai trò là một giáo viên Tin học giảng dạy tại trường THPT Chuyên Nguyễn Thiện Thành – TP Trà Vinh, hàng năm đều phải tham gia vào công tác bồi dưỡng học sinh giỏi của bộ môn, cho đến nay qua nhiều năm bồi dưỡng, bản thân tôi nhận thấy, trong cấu trúc của các đề thi học sinh giỏi môn Tin học, số lượng các bài toán trong một đề thi có thể giải bằng phương pháp quy hoạch động thường chiếm từ 30 – 70% của một đề thi, bởi khi ra đề thi ban tổ chức thường rãi đều các chuyên mục của các phương pháp như: duyệt, qui hoạch động và các thuật toán ứng dụng mô hình đồ thị, tuy nhiên trong đó có một số bài toán duyệt và ứng dụng mô hình đồ thị vẫn có thể áp dụng phương pháp quy hoạch động để giải Vì vậy có thể nói, quy hoạch động là một chuyên đề rất quan trọng mà mỗi học sinh thi tham gia đội tuyển học sinh giỏi đều phải nắm được nếu muốn đạt các thứ hạng cao ở các kỳ thi
Trang 4Với những lý do thiết thực đó, tôi xin chọn thực hiện đề tài:
“PHƯƠNG PHÁP QUY HOẠCH ĐỘNG VÀ VẬN DỤNG KẾT HỢP GIẢI CÁC BÀI TOÁN CHUYÊN TIN BẬC THPT”
2 Mục tiêu nghiên cứu
Xây dựng và phân tích có hệ thống các bài tập có thể giải bằng phương pháp Quy hoạch động, phân lớp chúng thành các lớp bài toán bằng cách nhận diện dựa trên kinh nghiệm của người học từ các bài toán quy hoạch động điển hình, kinh điển Vận dụng kết hợp để giải các bài toán chuyên Tin trong công tác bồi dưỡng học sinh giỏi môn Tin học
3 Đối tượng và phạm vi nghiên cứu
Phương pháp quy hoạch động Cấu trúc dữ liệu phù hợp để quy hoạch động Các đề thi học sinh giỏi tin học các cấp
4 Phương pháp nghiên cứu
Nghiên cứu lý thuyết về phương pháp quy hoạch động, nhận dạng các bài toán có thể giải bằng phương pháp quy hoạch động và phân tích các ưu điểm của nó từ đó kết hợp thêm các phương pháp khác để áp dụng giải các bài toán tối ưu
Thiết kế thuật toán dựa trên phương pháp quy hoạch động
5 Ý nghĩa khoa học và thực tiễn của đề tài
Ý nghĩa khoa học: Nghiên cứu và phân tích phương pháp quy hoạch động Vận dụng kết hợp vào việc giải các bài toán chuyên tin
Ý nghĩa thực tiễn: Giúp cho học sinh đạt kết quả cao hơn trong các
kỳ thi học sinh giỏi Tin học Làm tài liệu tham khảo để hỗ trợ cho học sinh giáo viên tin học dạy bồi dưỡng chuyên tin
Trang 5CHƯƠNG 1: LÝ THUYẾT VỀ QUY HOẠCH ĐỘNG 1.1 Giới thiệu về phương pháp quy hoạch động
1.1.1 Bài toán tối ưu
1.1.2 Nguyên lý Bellman
1.1.3 Bảng phương án
1.2 Nhận dạng bài toán quy hoạch động
1.3 Ưu điểm của quy hoạch động
1.4 Các bước thực hiện quy hoạch động
1.4.1 Xây dựng công thức truy hồi
Giả sử bài toán mà ta cần tìm là chi phí tối ưu dạng Max Gọi
Từ các giá trị ban đầu nêu trên, ta tăng dần số lượng các phần
tử lên (tăng độ lớn của bài toán), tìm điểm chung trong cách tính các phần tử từ bài toán cơ sở (F0 hoặc F1) đến bài toán đang xét (Fi) Từ đó
ta có được công thức truy hồi
Thông thường công thức truy hồi có dạng:
F i = Max(F i-1 , F i) {với i = 1 n} (*)
Trong đó:
- Fi là giá trị lớn nhất khi xét đến phần tử thứ i
- Max là hàm lấy giá trị lớn nhất của 1 trong các đối số của nó
- Fi-1 là bài toán con đã tối ưu ở bước liền kề trước đó
- Fi-1 cũng được tính theo công thức Fi-1 = Max(Fi-2, Fi-1)
- Và Fi-2 = Max(Fi-3, Fi-2)
- … cho đến
Trang 6- F1
- F0
1.4.2 Tổ chức dữ liệu và chương trình
1.4.3 Làm tốt (tối ưu thuật toán nếu được)
1.4.4 Truy vết tìm phương án tối ưu
Thông thường kết quả tối ưu của một bài toán quy hoạch động
là sau khi đã giải được bài toán sau cùng (bài toán thứ n, hay Fn), nếu bảng phương án là mảng 2 chiều thì hoặc là giá trị tối ưu (GTTU) nằm
ở cột cuối hoặc là GTTU nằm ở dòng cuối Từ các vị trí chứa các GTTU đó, ta tiến hành truy vết ngược trở về đi qua các bài toán con liền trước nó cũng đã đạt được GTTU, cho đến khi trở về bài toán cơ
sở ban đầu thì dừng
Vậy để có thể truy vết được thì ta phải tiến hành đánh dấu tại GTTU của bài toán thứ i mà ta đạt được Cụ thể, khi tiến hành cài đặt công thức (*) ở trên, ta phải lưu vết:
If Fi-1 > Fi Then
Begin
Fi := Fi-1
Lưu vết {chọn Fi-1} End Else
Lưu vết {không chọn Fi-1}
1.5 Các lớp bài toán quy hoạch động và ứng dụng
1.5.1 Dạng 1: Dãy con đơn điệu dài nhất
Trang 71.5.2 1 Mô hình
1.5.2 2 Công thức
1.5.2 3 Cài đặt
1.5.2 4 Một số bài toán biến thể cùng lớp với bài toán “chia kẹo”
1.5.3 Dạng 3: Xâu con chung dài nhất
1.6 Hạn chế của quy hoạch động
CHƯƠNG 2: GIỚI THIỆU MỘT SỐ THUẬT TOÁN VÀ CẤU TRÚC DỮ LIỆU ĐỂ KẾT HỢP VỚI PHƯƠNG PHÁP QUY
HOẠCH ĐỘNG 2.1 Bài toán 1: Phần thưởng
Tuấn là người chiến thắng trong một cuộc thi “tìm hiểu kiến thức vũ trụ” và được nhận các phần thưởng do công ty XYZ tài trợ Các phần thưởng được bố trí trên một bảng hình vuông n x n có dạng một lưới ô vuông kích thước đơn vị Các dòng của bảng được đánh số
từ 1 đến n, từ trên xuống dưới và các cột của bảng được đánh số từ 1 đến n, từ trái qua phải Ô nằm trên giao của dòng i và cột j được gọi là
ô (i,j) và trên ô đó chứa một món quà có giá trị là a[i,j] (1 <= i, j <= n)
Để nhận phần thưởng, Tuấn được phép chọn một hình vuông kích thước k x k chiếm trọn trong một số ô của bảng và nhận tất cả các phần quà có trong các ô nằm trong hình vuông đó
Yêu cầu: Hãy xác định tổng giá trị lớn nhất của món quà mà Tuấn có
thể nhận được
Trang 8Kết quả: Ghi ra một số nguyên duy nhất là tổng giá trị lớn nhất
của các món quà mà Tuấn có thể nhận được
Ví dụ:
* Cách giải 1: Duyệt từng hình vuông có độ dài cạnh k, với i,j là cặp
chỉ số góc trên bên trái hình vuông và x,y là góc dưới phải hình vuông Với mỗi hình vuông ta tiến hành tính tổng của chúng và so sánh với Max (Max ban đầu bằng - ∞) Độ phức tạp thuật toán là O(n4), không khả thi với yêu cầu của đề bài nếu n lớn
* Cách giải 2: Quy hoạch động
Gọi F[i,j] là tổng các giá trị từ ô[1,1] tới ô[i,j]
Tính tất cả các F[i,j] theo công thức truy hồi sau:
F[i,j]:=F[i,j-1] + F[i-1,j] + a[i,j] – F[i-1,j-1] ;
Sau khi tính, bảng F[i,j] có dạng như sau:
Trang 9Giải thích
Giả sử ô đang tính F[3,3] đƣợc tính bằng công thức truy hồi:
F[i,j]:=F[i,j-1] + F[i-1,j] + a[i,j] – F[i-1,j-1] ; F[3,3]:=F[3,2] + F[2,3] + a[3,3] – F[2,2]
Trang 102.2 Bài toán 2: Đoạn con liên tiếp có tổng lớn nhất
Cho dãy A gồm N số nguyên (N <= 100000) Tìm đoạn con (các phần tử liên tiếp) có tổng lớn nhất
* Cách giải 2: Quy hoạch động
Gọi F1[i] là tổng lớn nhất trong đoạn A[1 i] (có thể không chứa A[i])
Để tính đƣợc F1[i] ta dùng thêm 1 mảng phụ F2 với ý nghĩa: F2[i] là tổng lớn nhất trong đoạn A[1 i] có chứa A[i]
Cơ sở quy hoạch động:
F1[0]=0 ; F2[0] = 0 ;
Công thức truy hồi
F2[i] = Max(F2[i - 1] + A[i], A[i])
F1[i] = Max(F1[i - 1], F2[i])
Dựa vào quan hệ giữa F1[i - 1] và F2[i] để tìm ra phần tử cuối của đoạn con cần tìm Sau đó duyệt lui về 1 cho tới khi nào đạt đƣợc tổng lớn nhất (F1[n]) Độ phức tạp: O(n)
2.3 Quy hoạch động dựa trên bài toán đã đƣợc sắp xếp
2.3.1 Sắp xếp
2.3.2 Phát biểu bài toán
2.3.3 Các thuật toán sắp xếp thông dụng
2.3.3.1 Thuật toán sắp xếp nổi bọt (Bubble Sort)
2.3.3.2 Thuật toán sắp xếp nhanh (Quick Sort)
Trang 112.3.3.4 Sắp xếp bằng đếm phân phối (Distribution Counting)
Tại thời điểm G, tọa độ của robot i đang là ai (i=1,2, ,N), Ban
tổ chức công bố một bộ gồm M thẻ lệnh, mỗi thẻ ghi một số nguyên bj
(j=1,2, ,M) và yêu cầu các robot phải phối hợp phân công để mỗi robot đƣợc nhận một thẻ rồi đi chuyển đến tọa độ ghi trong thẻ Chi phí mà một robot di chuyển từ từ tọa độ x đến tọa độ y đƣợc tính là giá trị tuyệt đối của hiệu a-b Ban tổ chức sẽ đánh giá độ thông minh của các robot thông qua tổng chi phí S mà các robot phải chi phí cho việc di chuyển, theo tiêu chí: S càng nhỏ thì cảng đƣợc đánh giá cao
Yêu cầu: Cho biết tọa độ tại thời điểm G của N robot, M giá
trị ghi trong M thẻ lệnh của ban tổ chức, hãy cho biết giá trị nhỏ nhất của S mà các robot có thể đạt đƣợc
Trang 12Tất cả các số ai, bj, đều nguyên và nằm trong khoảng từ 0 đến 10000 Kết quả: Ghi ra duy nhất số nguyên S tìm được
2
Thuật toán quy hoạch động như sau
Sắp xếp mảng tọa độ a, b tăng dần (Dùng Quick Sort)
Gọi F[i,j] là chi phí nhỏ nhất để i robot di chuyển trong j vị trí cho trước:
Vì đã sắp xếp trước tọa độ của các robot và các thẻ nên:
- Ta có: F[0,0]=0; F[0,1]=0; F[0,2]=0;
Trường hợp 1: 1 robot và nhiều thẻ
- Nếu có 1 robot và 1 thẻ thì : F[1,1]=F[0,0] + abs(a[1]-b[1])
- Nếu có 1 robot và 2 thẻ thì F[1,2]=min (F[1,1], F[0,1] + abs(a[1]-b[2]))
- Nếu có 1 robot và 3 thẻ thì F[1,3]=min (F[1,2], F[0,2] + abs(a[1]-b[3]))
-
Trường hợp 2: nhiều robot và nhiều thẻ
- Nếu có 2 robot và 2 thẻ thì F[2,2]=F[1,1] + abs(a[2]-b2])
- Nếu có 2 robot và 3 thẻ thì F[2,3]=min (F[2,2], F[1,2] + abs(a[2]-b[3]))
- Nếu có 2 robot và 4 thẻ thì F[2,4]=min (F[2,3], F[1,3] + abs(a[2]-b[4]))
Trang 13- …
Từ đó ta suy ra công thức truy hồi
F[i,i]:= F[i-1,i-1] + abs(x[i] – y[i]), với mọi i trong khoảng [1 n]
F[i,j]:= min(F[i,j-1], F[i-1,j-1] + abs(x[i] – y[j]), với mọi i thuộc khoảng [1 n] và j thuộc [i+1 m]
Trang 14Bài 2: Đoạn gối nhau dài nhất
Cho N đoạn thẳng trên trục số với các điểm đầu ai và điểm cuối bi là những số nguyên trong khoảng 1000 1000, ai < bi Hãy tìm
số lƣợng tối đa K đoạn thẳng gối nhau liên tiếp Hai đoạn thẳng [a,b]
và [c,d] đƣợc gọi là gối nhau nếu xếp chúng trên cùng một trục số thì điểm đầu đoạn này trùng với điểm cuối của đoạn kia, tức là c = b hoặc
d = a
Dữ liệu vào: tệp văn bản DOAN.INP gồm
- Dòng đầu số N cho biết tổng các đoạn
- N dòng tiếp theo , mỗi dòng cho biết 2 số nguyên là điểm đầu ai
và điểm cuối bi
- Các số trên cùng một dòng cách nhau ít nhất một khoảng cách
Dữ liệu ra: tệp văn bản DOAN.OUT chứa:
- Duy nhất một số nguyên cho biết số lƣợng tối đa các đoạn tìm đƣợc
Trang 15Thuật toán quy hoạch động như sau
Để có thể quy hoạch động trước tiên ta cần sắp xếp tăng dần các đoạn theo đầu phải của chúng Sau đó tiến hành quy hoạch như sau:
Gọi L[i] là số lượng tối đa các đoạn gối nhau tính từ 1 đến i
Ban đầu độ dài tối đa tại đoạn thứ i là 1 (vì chỉ có chính nó) Đây là bài toán cơ sở quy hoạch động
Với mỗi đoạn thứ i, ta tìm tất cả các đoạn thứ j (j=1 i-1) mà
có điểm cuối = điểm đầu của i và độ dài L[j] là lớn nhất Nếu thỏa mãn thì ta thực hiện gán L[i]:=L[j]+1(độ dài của đoạn
thứ i bằng độ dài của đoạn thứ j +1 (j đang là dài nhất)) 2.4 Quy hoạch động kết hợp xử lý Bit để mô tả trạng thái bài toán
2.4.1 Bit và các thao tác xử lý Bit
2.4.1.1 Quy ước về vị trí của các bit
2.4.1.2 Các phép toán logic
2.4.1.3 Một số ứng dụng
2.4.2 Một số bài toán cùng lớp dùng quy hoạch động kết hợp bit
Dưới đây là một số bài toán quy hoạch động kết hợp xử lý bit
để mô tả trạng thái của bài toán
Bài 1: Chọn ô
Cho một bảng hình chữ nhật kích thước 4 × n ô vuông Các
dòng được đánh số từ 1 đến 4, từ trên xuống dưới, các cột được đánh
số từ 1 đến n từ trái qua phải Ô nằm trên giao của dòng i và cột j được gọi là ô (i,j) Trên mỗi ô (i,j) có ghi một số nguyên a ij , i = 1, 2, 3, 4; j
= 1,2, …, n Một cách chọn ô là việc xác định một tập con khác rỗng S của tập tất cả các ô của bảng sao cho không có hai ô nào trong S có chung cạnh Các ô trong tập S được gọi là ô được chọn, tổng các số
trong các ô được chọn được gọi là trọng lượng của cách chọn
Trang 16Ví dụ: Xét bảng với n=3, trong hình vẽ dưới đây
Cách chọn cần tìm là tập các ô S = {(3,1), (1,2), (4,2), (3,3)} với trọng
lượng 32
Yêu cầu: Hãy tìm cách chọn ô với trọng lượng lớn nhất
Dữ liệu: Vào từ file van bản SELECT.INP:
Dòng đầu tiên chứa số nguyên dương n là số cột của bảng
Dòng thứ j trong số n dòng tiếp theo chứa 4 số nguyên a 1j , a 2j ,
a 3j , a 4j, hai số liên tiếp cách nhau ít nhất một dấu cách, là 4 số
trạng thái, biểu diễn từ 0 tới
24 – 1
Gọi F[i,x] là tổng trọng lượng lớn nhất xét từ cột thứ 1 tới cột thứ i
và trạng thái chọn của cột thứ i được biểu diễn bằng biến x
-1 9 3 -4 5 -6
Trang 17Ta có công thức truy hồi như sau
F[i,x]:=max(F[i-1,y])+sum(i,x) Trong đó:
Biến x và y là 2 trạng thái tương ứng của cột thứ i và i – 1 Theo yêu cầu của bài toán thì trạng thái x và y phải thỏa mãn, bit thứ k của biến x phải khác bit thứ k của biến y vì việc chọn ô phải thỏa mãn không có hai ô nào có chung cạnh (Getbit(k,x) <> Getbit(k,y))
Hàm Sum(i,x) là trọng số của cột thứ i, tương ứng với trạng thái x Cài đặt: Biến A chứa giá trị của bảng, biến m = 24
– 1 , với m +1 là số trạng thái
Trong chương trình sẽ sử dụng một số hàm như sau:
+ Lấy bit thứ k của trạng thái x: Getbit(k,x)
function getbit(k,x:word):byte;
begin getbit:=(x shr k)and 1;
end;
+ Hàm kiểm tra trạng thái x có thỏa mãn yêu cầu bài toán hay không (không có hai ô nào có chung cạnh), nghĩa là bit thứ k và bit thứ k – 1 của trạng thái x phải khác nhau:
function check(x,y:word):boolean;
Trang 18F[i,x]:=max(F[i-1,y])+sum(i,x)
Để tính công thức trên ta sử dụng đoạn code sau đây:
vc:=1000000000;
for i:=1 to n do {xét lần lượt n cột}
for x:=0 to 15 do {với mỗi cột xét 2 4 trạng thái}
if ok(x) then {nếu trạng thái x thỏa mãn bài toán}
begin
max:=-vc;
{Tìm trạng thái y của cột thứ i-1 có tổng trọng lượng lớn nhất}
for y:=1 to 15 do
if check(x,y) and ok(y) then
if max<f[i-1,y] then max:=f[i-1,y];
Trang 19Hình 2.4 Bảng phương án tính F[n,x] của bài “Chọn ô”
Từ bảng lưu vết, xuất ra giá trị được chọn trong bảng dữ liệu vào a:
Trong kì nghỉ hè năm nay Sherry được bố thưởng cho 1 tour
du lịch quanh N đất nước tươi đẹp với nhiều thắng cảnh nổi tiếng (vì Sherry rất ngoan) Tất nhiên Sherry sẽ đi bằng máy bay
Giá vé máy bay từ đất nước i đến đất nước j là Cij (dĩ nhiên Cij có thể khác Cji) Tuy được bố thưởng cho nhiều tiền để đi du lịch nhưng Sherry cũng muốn tìm cho mình 1 hành trình với chi phí rẻ nhất có thể để dành tiền mua quà về tặng mọi người (Các chuyến bay của Sherry đều được đảm bảo an toàn tuyệt đối)