HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT...

191
2 KYU HI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊN Đồ sơn 7/2011

Transcript of HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT...

Page 1: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

2

KỈ YẾU

HỘI THẢO GIÁO VIÊN CÁC TRƯỜNGTHPT CHUYÊN

Đồ sơn 7/2011

Page 2: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

3

Mục lụcCÔNG TÁC DẠY CHUYÊN VÀ BỒI DƯỠNG HỌC SINH GIỎI Ở QUẢNG TRỊ .................... 4

ĐỊNH HƯỚNG CHUYÊN MÔN TRONG ĐÀO TẠO – BỒI DƯỠNG HỌC SINH NĂNG KHIẾUTIN HỌC........................................................................................................................................ 12

CÔNG TÁC PHÁT HIỆN VÀ BỒI DƯỠNG ĐỘI TUYỂN TIN HỌC TẠI TRƯỜNG THPTCHUYÊN LÊ HỒNG PHONG...................................................................................................... 28

GIẢI BÀI TOÁN TỐI ƯU TỔ HỢP BẰNG PHƯƠNG PHÁP DUYỆT...................................... 34

PHÁT HIỆN VÀ XÂY DỰNG ĐỘI TUYỂN QUỐC GIA........................................................... 41

LUỒNG CỰC ĐẠI DÒNG CHẢY TRONG MẠNG LƯỚI......................................................... 47

BIỂU DIỄN ĐỒ THỊ VÀ DUYỆT ĐỒ THỊ .................................................................................. 51

THAM LUẬN VỀ BỒI DƯỠNG HỌC SINH GIỎI MÔN: TIN HỌC TẠI THỪA THIÊN HUẾ.59

LOANG TRONG LƯỚI Ô VUÔNG ............................................................................................. 63

PHƯƠNG PHÁP QUY HOẠCH ĐỘNG TRẠNG THÁI ............................................................. 99

PHƯƠNG PHÁP QUY HOẠCH ĐỘNG..................................................................................... 109

TỔ CHỨC CÁC HOẠT ĐỘNG VỀ CNTT TRONG TRƯỜNG THPT CHUYÊN HẠ LONG TỈNHQUẢNG NINH ............................................................................................................................ 143

DẠY HỌC CHUYÊN ĐỀ GIẢI THUẬT THAM LAM ............................................................. 146

DẠY HỌC CHUYÊN ĐỀ DUYỆT TOÀN BỘ VÀ NÂNG CAO.............................................. 152

GIỚI THIỆU PHƯƠNG PHÁP QUY HOẠCH ĐỘNG .............................................................. 162

CHƯƠNG TRÌNH TỰ HỌC TỰ BỒI DƯỠNG GIÁO VIÊN MÔN TIN HỌC GIAI ĐOẠN 2011-2015.............................................................................................................................................. 182

KINH NGHIỆM PHÁT HIỆN VÀ BỒI DƯỠNG ĐỘI TUYỂN TIN HỌC CỦA HẢI PHÒNG185

PHƯƠNG PHÁP DẠY HỌC MÔN TIN HỌC CHUYÊN.......................................................... 190

Page 3: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

4

CÔNG TÁC DẠY CHUYÊN VÀ BỒI DƯỠNG HỌC SINH GIỎI ỞQUẢNG TRỊ

ThS. Đoàn Thị Ái Phương, Sở GD&ĐT Quảng Trị

ĐẶT VẤN ĐỀ

Giáo dục và Đào tạo có vai trò hết sức quan trọng đó là đào tạo nguồn nhân

lực cho xã hội, Giáo dục được coi là nền móng của sự phát triển Khoa học – Kỹthuật và đem lại sự phát triển cho đất nước. Có thể nói rằng không có giáo dụcthì không có sự phát triển đối với con người. Đảng ta đã coi "Giáo dục là quốcsách hàng đầu" Hội nghị TW 4 khoá VII đã khẳng định "Giáo dục - Đào tạo làchìa khoá để mở cửa tiến vào tương lai". Nghị quyết TW 2 khoá VIII đã tiếp tụckhẳng định "Muốn tiến hành Công nghiệp hóa, hiện đại hóa thắng lợi thì phảiphát triển mạnh Giáo dục - Đào tạo, phát huy nguồn lực con người, yếu tố cơbản của sự phát triển nhanh và bền vững". Đại hội Đảng lần thứ X tiếp tục nhấn

mạnh Giáo dục vừa là động lực vừa là mục tiêu của sự phát triển.

Với mục tiêu đào tạo nguồn nhân lực chất lượng cao, bồi dưỡng nhân tài

cho quê hương, đất nước, công tác bồi dưỡng những học sinh năng khiếu để trởthành những công dân toàn diện trong xu thế hội nhập là việc làm hết sức quan

trọng. Vì vậy việc phát hiện và bồi dưỡng học sinh giỏi trở thành vấn đề cấpthiết trong chiến lược xây dựng và phát triển đất nước, đây là một trong nhữngthước đo để kiểm định chất lượng mũi nhọn của Giáo dục.

Xác định được mục tiêu và tầm quan trọng của công tác đào tạo nhân lực

và bồi dưỡng nhân tài cho tỉnh nhà, trong những năm qua chính quyền địaphương và ngành Giáo dục Quảng Trị đã hết sức quan tâm đến đội ngũ của

trường Chuyên và công tác bồi dưỡng đội tuyển học sinh giỏi của Tỉnh.

THỰC TRẠNG TÌNH HÌNH BỒI DƯỠNG HỌC SINH GIỎI HIỆN

NAY

Thuận lợi

Page 4: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

5

Nhà nước, chính quyền địa phương và ngành Giáo dục Quảng Trị đã hết

sức quan tâm đến đội ngũ và công tác bồi dưỡng học sinh giỏi, mặc dù chưa đápứng được đầy đủ những yêu cầu và mong muốn của giáo viên, nhưng nhà nước

đã có những chính sách ưu đãi đối với đội ngũ giáo viên dạy trường Chuyên.

Sở Giáo dục và Đào tạo Quảng Trị luôn quan tâm chỉ đạo và có những

chính sách và kế hoạch cụ thể đối với công tác bồi dưỡng học sinh giỏi ở trường

Chuyên.

Bộ GD&ĐT đã có định hướng rõ hơn về chương trình và công tác bồi

dưỡng ở trường Chuyên. Việc tập huấn phương pháp dạy học cho trường

Chuyên năm qua đã định hướng lại một cách rõ ràng hơn trong việc bồi dưỡng

học sinh giỏi, phát huy năng khiếu, bồi dưỡng nhân tài chứ không nhằm mục

tiêu lấy giải trong các kỳ thi. Việc Bộ GD&ĐT công bố đáp án trong kỳ thi vừa

qua là một căn cứ cơ bản làm rõ hơn trong việc xác định nội dung, mức độ,

phương pháp và kỹ năng làm bài cần có cho học sinh trong các kỳ thi.

Đội ngũ giáo viên tham gia bồi dưỡng đội tuyển là những giáo viên dạy

Chuyên nhiều năm, có năng lực và tâm huyết với công tác bồi dưỡng học sinh

giỏi.

Khó khăn

Trong vài năm lại đây công tác bồi dưỡng học sinh giỏi và đội tuyển gặp

rất nhiều khó khăn, một phần do có một số thay đổi về chủ trương quyền lợi cơbản của học sinh đạt giải Quốc gia. Học sinh hầu hết là không mặn mà, thiết tha

với việc thi học sinh giỏi, môn Tin Học lại càng khó hơn, các em chủ yếu tập

trung cho việc thi Đại học. Vì vậy, tinh thần học tập của các em trong khâu bồi

dưỡng học sinh giỏi là không nhiệt tình, không hết mình, thiếu sự đam mê, nhiều

khi mang tính nghĩa vụ vì sợ nhà trường khiển trách.

Hầu hết phụ huynh đều không ủng hộ và ngăn cản con em mình vào đội

tuyển, họ chỉ muốn đầu tư cho con em họ học để thi vào Đại học, đây cũng làmột vấn đề hết sức nan giải trong công tác chọn đội tuyển.

Đội ngũ giáo viên dạy Chuyên và tham gia công tác bồi dường còn quá

thiếu, càng ngày càng nhiều giáo viên không còn muốn tham gia, đây là khókhăn lớn nhất, bởi thiếu đội ngũ giáo viên thì thật khó nói đến việc bồi dưỡng có

Page 5: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

6

hiệu quả. Có nhiều lý do để dẫn đến thiếu đỗi ngũ, có lẽ phải nói đến là chính

sách đãi ngộ đối với Giáo dục nói chung và người làm công tác bồi dưỡng học

sinh giỏi nói riêng. Vì vậy những sinh viên giỏi của khoa Tin các trường ĐHSPkhi tốt nghiệp ra trường hầu hết không đi dạy mà đi vào làm việc ở những ngành

khác.

Với những thuận lợi và khó khăn đó, ngành Giáo dục Quảng Trị trong

những năm qua đã nổ lực hết mình, khắc phục khó khăn, vượt lên chính mình đểlàm được những gì có thể để thực hiện mục tiêu và nhiệm vụ đã đề ra.

CÔNG TÁC PHÁT HIỆN VÀ KINH NGHIỆM BỒI DƯỠNG ĐỘI

TUYỂN

Công tác phát hiện và tuyển chọn học sinh

Trong công tác bồi dưỡng học sinh giỏi, khâu phát hiện và tuyển chọn học

sinh là khâu hết sức quan trọng, nó quyết định đến chất lượng và sự thành công

của đội tuyển.

Việc phát hiện và tuyển chọn học sinh căn cứ vào nhiều cơ sở, và từng giai

đoạn khác nhau. Để phát hiện và tuyển chọn chính xác, đúng những tài năngthực sự, nhà trường đã căn cứ vào nhiều thông tin. Việc tổ chức, phát hiện,

tuyển chọn được nhà trường phân công cho tổ bộ môn và từng giáo viên, giáo

viên đưa vào kế hoạch công tác của mình và có kế hoạch bàn giao cho giáo viên

kế cận năm sau.

- Đầu tiên nhà trường chú trọng và quan tâm việc phát hiện và chọn đội

tuyển ngay từ khi các em thi tuyển vào lớp 10, căn cứ vào kết quả thi tuyển của

các em trong lớp chuyên Tin để khoanh vùng lựa chọn. Sau đó tổ chức thi khảo

sát để đánh giá lại và chọn sơ bộ đội tuyển và tổ chức bồi dưỡng ngay từ lớp 10.

- Dựa trên cơ sở bài khảo sát chất lượng đầu năm, qua thực tế các giờ học

trong những tuần đầu và kết quả học bộ môn phát hiện và bổ sung vào đội tuyển.

- Đối với lớp chuyên Toán, trong quá trình dạy học trên lớp, quá trình tiếp

xúc với học sinh, nếu phát hiện học sinh nào có sự yêu thích Tin học, có sự đammê trong khai thác và khám phá các lĩnh vực của Tin Học, thi giáo viên sẽ có

trách nhiệm giúp đỡ các em, hướng các em tiếp cận dần với các chuyên đề bồi

Page 6: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

7

dưỡng cho học sinh chuyên Tin. Khi thấy các em thực sự có khả năng và yêuthích thì sẽ bổ sung các em vào đội tuyển và các em sẽ được hưởng mọi chế độnhư các em trong đội tuyển Tin học. Qua thực tế nhiều năm phát hiện cho thấy,

những em học sinh này thực sự phát triển rất tốt và thường đạt giải trong các kỳthi Quốc gia.

Công tác tổ chức giảng dạy và bồi dưỡng

Đào tạo học sinh Chuyên và bồi dưỡng học sinh giỏi là một quá trình mang

tính khoa học, không thể chỉ một vài tháng mà phải có kế hoạch cụ thể trong

suốt cả ba năm học. Chỉ có như thế mới cung cấp được đầy đủ các kiến thức cần

thiết cho học sinh và phát hiện chính xác khả năng học tập của các em. Công tác

này ảnh hưởng trực tiếp đến sự thành công hay thất bại của công tác đào tạo bồi

dưỡng học sinh giỏi.

a) Kế hoạch bồi dưỡng

Trường đã xây dựng được một kế hoạch bồi dưỡng hàng năm cho học sinh

ngay từ năm lớp 10. Những năm trước đây khi chưa có chương trình học 37 tuần

của Bộ GD&ĐT, thì trường THPT Chuyên thường học sớm 1 tháng trước khi

vào năm học mới. trong 1 tháng này chỉ tập trung chủ yếu để dạy môn chuyên.

Sau khi vào năm học, những học sinh được chọn sẽ tham gia học bồi dưỡng

thêm 1 tuần 2 đến 3 buổi.

Tổ chuyên môn đã xây dựng chương trình bồi dưỡng trên cơ sở chươngtrình hướng dẫn của Bộ GD&ĐT sao cho phù hợp với tình hình thực tế tại

Quảng Trị, Chương trình được ban giám hiệu nhà trường duyệt và thông qua.

Trước khi nghĩ hè, tổ chuyên môn sẽ phân công các giáo viên phụ trách các

chuyên đề bồi dưỡng cho năm sau. Nội dung bồi dưỡng sẽ được giáo viên

chuẩn bị trước trong hè để bồi dưỡng cho học sinh khi học sinh bắt đầu vào nămhọc mới.

Kết thúc mỗi chuyên đề đều cho học sinh làm bài kiểm tra để đánh giá, trêncơ sở đó kịp thời bổ sung uốn nắn những chổ hỏng cho học sinh.

b) Công tác tổ chức bồi dưỡng

Mục tiêu đào tạo học sinh Chuyên và bồi dưỡng học sinh giỏi là đào tạo

cho các em có kiến thức khoa học cơ bản, hiện đại, tiến tiến, có tính tự lập và

Page 7: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

8

khả năng sáng tạo, nhận thức ở mức độ cao. Trong đó việc rèn luyện cho học

sinh có tính tự lập và khả năng nhận thức ở mức độ cao là quan trọng và hết sức

khó khăn.

Để đạt được mục tiêu đó, trong khâu tổ chức dạy học, giáo viên cần phải

thực hiện một số nội dung sau:

- Từ những khó khăn đã nêu trên, nhất là đối với học sinh chuyên Tin thì

trước tiên giáo viên phải làm công tác tư tưởng cho học sinh, phân tích cho học

sinh thấy lợi thế của học sinh chuyên Tin sau này vào Đại học, có thể lấy gươngcủa các thế hệ anh chị đi trước để làm tăng thêm niềm tin cho các em, Qua đólàm cho các em yêu thích môn học và say mê học tập.

- Giáo viên phải giới thiệu chương trình, các loại sách, tài liệu tham khảo

và cách truy cập Internet để tìm tài liệu học tập cho học sinh.

- Hướng dẫn học sinh cách học, cách ghi chép bài, hướng dẫn học sinh tiếp

thu một số kiến thức cơ bản về môn Chuyên.

- Giúp học sinh biết cách giải quyết, khai thác một đơn vị kiến thức hay

một bài tập. Từ đó tập cho các em khả năng tư duy logic, tư duy độc lập sáng tạo

và biết cách phân loại các bài tập, tổng quát hóa một vấn đề của kiến thức.

- Sau khi các em đã học xong một số kiến thức cơ bản, tổ chức kiểm tra

định kỳ theo từng chuyên đề đã bồi dưỡng.

- Hướng dẫn học sinh tự học, cách xây dựng bộ test để tự test các bài tập

cho mình và cho bạn. Giới thiệu với các em các trang web hay và hướng dẫn các

em tham gia giải bài trực tuyến trên trang ICAP hoặc trên tạp chí Tin học và nhà

trường.

c) Tổ chức học tâp của học sinh

Trong quá trình giảng dạy môn chuyên và bồi dưỡng HSG thì công tác tổchức học tập của học sinh là một yếu tố rất quan trọng, nó ảnh hưởng đến sựthành công hay thất bại của hoc sinh. Để làm tốt công tác này ta cần thực hiện

tốt những nội dung sau:

Page 8: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

9

- Học sinh khi học môn chuyên hay tham gia các đội tuyển phải có trách

nhiệm trong việc học tập, rèn luyện của minh, các em phải có lời hứa danh dựtrước Thấy Cô bộ môn và Lãnh đạo nhà trường.

- Ngoài việc học tập trên lớp các giờ chính khóa, học sinh phải tham gia

đầy đủ các buổi học bối dưỡng, tham gia giải các bài tập trong sách nâng cao,

trong các chuyên đề, trong các tài liệu tham khảo, nghiên cứu và giải các đề thi

trên mạng hay Tạp chí.

- Các giáo viên khi giảng dạy nên thành lập các nhóm học tập trong học

sinh. Từ đó giao cho các em một số chuyên đề tự nghiên cứu, Việc làm này giúp

học sinh có lòng say mê, tự tin trong học tập, có phương pháp tự nghiên cứu.

- Mỗi học sinh cần phải có một cuốn sổ tự học, tích lủy kiến thức trong

đó bao gồm các bài tập hay, các đề thi cùng đáp án, các kiến thức tự tìm hiểu,

đúc kết sau một quá học tập và sáng tạo,…. Những ghi chép này rất cần thiết

cho việc học tập, rèn luyện nâng cao khiến thức của học sinh giỏi

d) đội ngũ giáo viên

Đội ngũ giáo viên đóng một vai trò vô cùng quan trọng trong việc đàotạo, bồi dưỡng học sinh giỏi. Vì vậy nhà trường phải chọn ra được một đội ngũgiáo viên có năng lực, nhiệt tình và tâm huyết để tham gia giảng dạy và bồi

dưỡng học sinh giỏi. Mỗi giáo viên đươc giao nhiệm vụ phụ trách từng mảng

chuyên đề để dễ nghiên cứu và giảng dạy có chất lượng. Các chuyên đề này có

thể thay đổi theo chu kỳ hàng năm để giáo viên có thể được dạy qua tất cả các

chuyên đề, từ đó có cái nhìn tổng quát về chương trình bồi dưỡng học sinh giỏi.

Giáo viên dạy Chuyên hay bồi dưỡng học sinh giỏi. phải tham khảo

nhiều tài liệu một cách thường xuyên để cập nhật, bổ sung và phát triển chuyên

đề mà mình phụ trách, phải chủ động đi trước học sinh một bước, thường xuyên

vào các trang đề thi olympic của các nước lấy một số đề về cho học sinh giải,

hướng dẫn và cùng tham gia giải bài tập với học sinh.

Trong công tác giảng dạy và bồi dưỡng học sinh giỏi, nhiệm vụ quan trọng

của người Thầy là phải dạy cho các em tiếp cận kiến thức một cách tự nhiên,

chủ động và sáng tạo, cụ thể là dạy cho các em cách tìm đến kiến thức và nghiên

cứu nó, cách làm bài tập, cách đọc sách và tìm tài liệu, cách mở rộng và khai

Page 9: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

10

thác kiến thức,… Người Thầy phải luôn thắp sáng ngọn lửa say mê môn học cho

học sinh, phải dạy cho các em biến ước mơ thành hiện thực, biết vượt qua khó

khăn để cố gắng vươn lên, biết rút kinh nghiệm sau những thất bại hay thành

công trong từng giai đoạn mà mình phấn đấu.

Học sinh khi tham gia vào đội tuyển phải chịu rất nhiều áp lực, do đó giáoviên dạy chuyên và bồi dưỡng học sinh giỏi phải là người luôn gần gủi, chia sẻ,

động viên, khuyến khích các em, giúp các em hứng khởi trong quá trình học tập

và bồi dưỡng.

KINH NGHIỆM BỒI DƯỠNG VÀ PHÁT TRIỂN ĐỘI NGŨ GIÁOVIÊN CHUYÊN

Đội ngũ giáo viên có một vai trò vô cùng quan trọng để làm cho giáo dụcthực hiện được sứ mệnh cao cả đó là đào tạo nhân lực và bồi dưỡng nhân tài cho

quê hương đất nước. Vì vậy phát triển đội ngũ giáo viên là yêu cầu cấp thiết, là

yếu tố cơ bản có ý nghĩa quyết định trong việc phát triển giáo dục, đặc biệt là

bồi dưỡng và phát triển đội ngũ giáo viên Chuyên.

Trong những năm qua, ngành giáo dục Quảng trị luôn quan tâm bồi dưỡng

và phát triển đội ngũ giáo viên Chuyên.

- Qua các kỳ thi giáo viên dạy giỏi, Trưởng bộ môn và giáo viên cốt cán

của bộ môn luôn chú ý phát hiện những giáo viên có năng lực, có tâm huyết với

nghề nghiệp. Từ đó theo dỏi, bồi dưỡng để dần dần tiếp cận với công tác bồi

dưỡng học sinh giỏi và giới thiệu cho lãnh đạo Sở có kế hoạch bổ sung đội ngũcho giáo viên Chuyên.

- Tìm hiểu ở khoa Tin của trường ĐHSP để phát hiện những sinh viên có

khả năng, giới thiệu cho ngành để có chính sách thu hút và bố trí sau khi ra

trường, để từ đó bồi dưỡng dần cách tiếp cận với chương trình dạy Chuyên và

bồi dưỡng học sinh giỏi.

- Hàng năm Hội đồng bộ môn Tin học ở Quảng Trị tham mưu với lãnh đạo

cho phép bộ môn mời các Giáo sư, Tiến sỹ đầu ngành, có trình độ cao và nhiều

kinh nghiệm trong giảng dạy với các chuyên đề liên quan đến công tác dạy

Chuyên và bồi dưỡng học sinh giỏi về bồi dưỡng nâng cao trình độ cho đội ngũgiáo viên Tin học của tỉnh, từ đó năng cao dần trình độ cho đội ngũ.

Page 10: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

11

KẾT LUẬN

Công tác dạy Chuyên và bồi dưỡng học sinh giỏi ở Quảng Trị những nămgần đây tuy chưa đạt được kết quả cao trong kỳ thi học sinh giỏi Quốc gia,

nhưng phần nào đã đáp ứng được yêu cầu rèn luyện các mục tiêu nhận thức ởmức độ cao, sự trưởng thành của học sinh sau khi khi rời ghế nhà trường phổthông. Hầu hết các em học sinh chuyên Tin đều được học tập ở môi trường cao

hơn và học giỏi ở các trường Đại học. Nhiều em đang giữ những vị trí chủ chốt

ở các Trường Đại học và các ngành khoa học, nhiều em đã rất thành đạt đảm

nhiệm ỏ một số vị trí cao trong các ngành và đã quay về giúp đỡ nhà trường,

giúp tỉnh nhà trong các chiến lược xây dựng và phát triển quê hương. Điều đócho thấy mô hình đào tạo Chuyên, bồi dưỡng học sinh học sinh giỏi là hết sức

cần thiết, cần phát huy và phát triển mạnh hơn nửa.

Đội ngũ giáo viên đóng một vai trò hết sức quan trọng để phát triển mô

hình đào tạo Chuyên, bồi dưỡng học sinh học sinh giỏi. Vì vậy cần phải có

những chính sách và chiến lược xây dựng và phát triển đội ngũ, phải thu hút

những nhân tài về với ngành Giáo dục, những em học sinh giỏi của nhà trường

sau khi tốt nghiệp Đại học trở về giảng dạy ở trường…có như thế thì mới làm

cho thực hiện được mục tiêu của ngành Giáo dục là trường Chuyên là nơi đàotạo nhân lực chất lượng cao và bồi dưỡng nhân tài cho quê hương đất nước.

Page 11: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

12

ĐỊNH HƯỚNG CHUYÊN MÔN TRONG ĐÀO TẠO – BỒI DƯỠNG HỌCSINH NĂNG KHIẾU TIN HỌC

Nguyễn Thanh Tùng, GV Đại học Bách Khoa HN

A – ĐỊNH HƯỚNG

Các cuộc thi Olympic Tin học được triển khai rộng rãi ở gần hết các nước

trên thế giới hướng tới các mục đích:

Đẩy mạnh phong trào dạy và học Tin học nhằm đáp ứng các yêu cầu của

cuộc sống đang được tin học hóa sâu rộng và với tốc độ cao trong mọi lĩnh vực,

Phát hiện các nhân tố nổi bật để đào tạo và khai thác nguồn nhân lực đỉnh

cao, có tri thức và có tay nghề theo kịp sự phát triển của lý thuyết và yêu cầu của

thực tế.

Việc đào tạo, bồi dưỡng học sinh giỏi Tin học chịu tác động rất nhiều của

hai yếu tố:

Sự phát triển của lý thuyết,

Sự phát triển của công cụ Tin học.

Có thể thấy rõ xu hướng dạy và học Tin học cho đến nay chia thành ba giai

đoạn:

Giai đoạn I: những năm cuối của thế kỷ XX,

Giai đoạn II: Thập kỷ đầu tiên của thế kỷ XXI,

Giai đoạn III: Thập kỷ thứ 2 của thế kỷ XXI, tức là những năm hiện tại.

Ở giai đoạn I, ngành Tin học mới tách ra và phát triển thành một ngành

khoa học độc lập. Người ta tập trung mọi sức lực vào việc xây dựng nền móng

cho một ngành khoa học mới, cố gắng tìm cách để giải quyết được các lớp bài

toán truyền thống xuất hiện khi tiếp cận bài toán trên quan điểm toán học.

Việc nắm vững các kiến thức toán học là điều kiện chủ yếu để giải quyết các bài

toán tin học. Ngoài ra còn phải lưu ý tới cấc ràng buộc tự nhiên về bộ nhớ nhỏvà tốc độ tương đối thấp của máy tính lúc bấy giờ. Đó là sự tiếp tục của tư duynhững năm 70 – 80 của thế kỷ 20.

Page 12: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

13

Ví dụ,

Chúng ta đã đạt được những kết quả rực rỡ trong thời kỳ này vì đội ngũgiáo viên tin học phần lớn xuất thân từ giáo viên chuyên ngành toán. Học sinh

của chúng ta được trang bị kiến thức cơ sở về toán khá tốt.

Giai đoạn II từ những năm 2001 đến 2007, sự tiến bộ về công nghệ và sựphổ cập của các hệ thống phần mềm tiên tiến đã đưa đến những sự chuyển dịch

trong việc đào tạo chuyên gia trong lĩnh vực tin học. Điều này dẫn đến những

thay đổi trong công tác phát hiện, đào tạo và bồi dưỡng học sinh giỏi tin học. Do

đó nội dung thi Tin học Quốc tế cũng có nhiều thay đổi. Các kiến thức giải thuật

được coi là đỉnh cao trước đây bây giờ đã trở thành “bảng cửu chương” mà aicũng phải biết và phải thuộc. Những giải thuật phức tạp, ít dùng thì không nhất

thiết phải thuộc, nhưng bất cứ ai và lúc nào cũng có thể tra cứu, tìm kiếm chúng

trên Internet khi cần thiết. Sự thông minh và tính sáng tạo bây giờ phải thể hiện

không phải ở chổ bạn thuộc nhiều hay ít các giải thuật khác nhau, cũng khôngphải bạn cài đặt chúng nhanh tới mức nào. Thử thách bây giờ là ở chổ bạn có thểtìm ra những giải pháp hữu hiệu giải quyết một cách có hiệu quả các bài toán

các vấn đề có mô hình toán học đơn giản nhưng có kích thước lớn hay không?

Để đạt được mục đích đó người lập trình phải biết tận dụng tối đa khảnăng mà phần cứng và hệ điều hành cung cấp. Các hệ thống lập trình mới nhưFree Pascal, Dev C++ (những phiên bản đầu tiên) đã tạo điều kiện để người

dùng khai thác được tối đa khả năng của phần cứng.

Đáng tiếc là tới tận năm 2007 khi thế giới đã đi hết chặng đường quan

trọng này thì chúng ta mới được phép chính thức đặt chân lên mãnh đất đã in

đầy dấu chân của những người tiên phong, đi vào con đường vốn bây giờ đã trởthành kỷ niệm đẹp của những người đi trước.

Ở giai đoạn III, tức là ở những năm gần đây, trong danh mục yêu cầu đối

với người lập trình có thêm hai đòi hỏi mới:

Không những bạn phải đứng vững trên nền tảng của phần cứng và hệ thống

mà còn phải biết khai thác tối đa khả năng của công cụ lập trình. Cụ thể, bạn

phải khai thác được triệt để mặt mạnh của các thư viện của hệ thống lập trình

có trong tay,

Page 13: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

14

Nâng cao tính hoàn thiện của chương trình: chương trình phải cho kết quả

đúng và xử lý có hiệu quả với từng lớp dữ liệu (của bài toán).

Các hệ thống lập trình như Free Pascal 2.4.4, Dev C++ 4.9.9 đều cung cấp

những thư viện khổng lồ hỗ trợ người dùng và đều có thể mang lại những hiệu

quả tương đương trong lập trình. Tuy vậy C++ nhận được sự lựa chọn đông đảo

thí sinh dự thi hơn vì các lý do:

Thư viện chuẩn hộ trợ lập trình của C++ dễ tiếp cận hơn vì có nhiều tài liệu

giới thiệu,

Có nhiều phiên bản chương trình dịch miễn phí để những Ban tổ chức cung

cấp cho thí sinh,

Ở nhiều nước lấy C++ làm cơ sở giảng dạy ở trường phổ thông,

Trong tương lai, khi lên đại học người ta sẽ dùng C++ là chủ yếu,

Mặt mạnh của Pascal là khả năng thể hiện có cấu trúc trong quá trình triển

khai giải thuật không còn là trọng tâm trong nội dung giảng dạy,

C++ cho phép xây dựng chương trình tối ưu, thể hiện các tiểu xảo lập trình.

Tuy vậy, C++ cũng có những mặt yếu của nó so với Pascal. Ta sẽ nói đến

những vấn đề này muộn hơn, khi đề cập tới công cụ lập trình.

14

Nâng cao tính hoàn thiện của chương trình: chương trình phải cho kết quả

đúng và xử lý có hiệu quả với từng lớp dữ liệu (của bài toán).

Các hệ thống lập trình như Free Pascal 2.4.4, Dev C++ 4.9.9 đều cung cấp

những thư viện khổng lồ hỗ trợ người dùng và đều có thể mang lại những hiệu

quả tương đương trong lập trình. Tuy vậy C++ nhận được sự lựa chọn đông đảo

thí sinh dự thi hơn vì các lý do:

Thư viện chuẩn hộ trợ lập trình của C++ dễ tiếp cận hơn vì có nhiều tài liệu

giới thiệu,

Có nhiều phiên bản chương trình dịch miễn phí để những Ban tổ chức cung

cấp cho thí sinh,

Ở nhiều nước lấy C++ làm cơ sở giảng dạy ở trường phổ thông,

Trong tương lai, khi lên đại học người ta sẽ dùng C++ là chủ yếu,

Mặt mạnh của Pascal là khả năng thể hiện có cấu trúc trong quá trình triển

khai giải thuật không còn là trọng tâm trong nội dung giảng dạy,

C++ cho phép xây dựng chương trình tối ưu, thể hiện các tiểu xảo lập trình.

Tuy vậy, C++ cũng có những mặt yếu của nó so với Pascal. Ta sẽ nói đến

những vấn đề này muộn hơn, khi đề cập tới công cụ lập trình.

14

Nâng cao tính hoàn thiện của chương trình: chương trình phải cho kết quả

đúng và xử lý có hiệu quả với từng lớp dữ liệu (của bài toán).

Các hệ thống lập trình như Free Pascal 2.4.4, Dev C++ 4.9.9 đều cung cấp

những thư viện khổng lồ hỗ trợ người dùng và đều có thể mang lại những hiệu

quả tương đương trong lập trình. Tuy vậy C++ nhận được sự lựa chọn đông đảo

thí sinh dự thi hơn vì các lý do:

Thư viện chuẩn hộ trợ lập trình của C++ dễ tiếp cận hơn vì có nhiều tài liệu

giới thiệu,

Có nhiều phiên bản chương trình dịch miễn phí để những Ban tổ chức cung

cấp cho thí sinh,

Ở nhiều nước lấy C++ làm cơ sở giảng dạy ở trường phổ thông,

Trong tương lai, khi lên đại học người ta sẽ dùng C++ là chủ yếu,

Mặt mạnh của Pascal là khả năng thể hiện có cấu trúc trong quá trình triển

khai giải thuật không còn là trọng tâm trong nội dung giảng dạy,

C++ cho phép xây dựng chương trình tối ưu, thể hiện các tiểu xảo lập trình.

Tuy vậy, C++ cũng có những mặt yếu của nó so với Pascal. Ta sẽ nói đến

những vấn đề này muộn hơn, khi đề cập tới công cụ lập trình.

Page 14: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

15

B – CÔNG CỤ LẬP TRÌNH

Trang bị kiến thức về ngôn ngữ lập trình chưa bao giờ là một vấn đề lớn

trong tin học. Điều quan trọng là kỹ thuật lập trình và tổ chức dữ liệu. Khi đã

biết tương đối tốt một ngôn ngữ lập trình thì việc chuyển sang lập trình ở một

ngôn ngữ mới khá đơn giản.

Bên cạnh ngôn ngữ truyền thống PASCAL với hệ thống lập trình Free

Pascal và C++ với hệ thống lập trình DEV C++, nhiều nước còn cho phép và

khuyến khích sử dụng một loạt các ngôn ngữ khác như Delphi, Python, Java,C#, v . v . . .

Đương nhiên, khi chọn một ngôn ngữ nào đó làm công cụ cho mình người

lập trình cần phải:

Biết rõ những điểm mạnhvà yếu của ngôn ngữ cũng như của hệ thống hệthống lập trình hỗ trợ,

Cần nắm vững các dịch vụ mà hệ thống lập trình cung cấp,

Cần có thói quen suy nghĩ và hành động phù hợp với ngôn ngữ và hệthống lập trình,

Cần biết càng sâu càng tốt các thư viện chuẩn hỗ trợ lập trình và biết khai

thác chúng một cách tối ưu.

Nếu có cách tiếp cận hợp lý thì những vấn đề trên có thể giải quyết được

một cách khá đơn giản và hiệu quả.

Ở nước ta, trong bậc PTTH hệ thống lập trình được sử dụng phổ biến là

ngôn ngữ PASCAL với hệ thống lập trình Free Pascal. Ở bậc đại học, ngôn ngữlập trình chủ yếu là C/C++ với hệ thống Dev C++.

Trên thế giới nhiều nước sử dụng C++ với các hệ thống lập trình Dev C++

hoặc tương đươngngay từ bậc phổ thông trung học.

Việc giảng dạy đại trà trong nhà trường không phải là vấn đề thảo luận ởđây. Nhưng việc trang bị công cụ cho học sinh năng khiếu, phục vụ cho các kỳthi Tin học là vấn đề nằm trong tầm xem xét và xử lý của chúng ta.

Các thành phần và cấu trúc tương đương của 2 hệ thống lập trình

Page 15: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

16

Các phép tính số học

Stt PASCAL C/C++Ví dụ

Pascal C/C++

+ + a + b a + b

- - a - b a - b

* * a * b a * b

/ / a / b a / b

DIV / n div m n / m

MOD % n mod m n % m

Các phép tính quan hệ

Stt PASCAL C/C++Ví dụ

Pascal C/C++

< < a < b a < b

<= <= a <= b a <= b

= == a = b a == b

>= >= a >= b a >= b

<> != a<>b a!=b

and && Pascal sử dụng các

phép xử lý bit để tạo

biểu thức quan hệ.or ||

not !

Page 16: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

17

Các phép tính xử lý bit

Stt PASCAL C/C++Ví dụ

Pascal C/C++

not ~

and |

or &

xor ^

shl <<

shr >>

Khai báo

Lệnh gán

PASCALVar i,j,k:integer;m,n: longint;

a,b:real;p,d:int64;x:array[0..20] of longint;y:array[1..10, 1..5] of longint;z:array[1..15] of real;c:char;

s:string;

C++int i,j,k;long m,n,x[21], y[10][5];float a,b,z[15];long long p,d;char c;string s;

PASCALa:=y[i,j];a:=a+b;a:=a*z[i];i:=i+1;k:=i div j;k:=i mod j;

C++a=y[i][j];a+=b; // a=a+b;a*=z[i];i++; // ++i;k=i/j;k=i%j;

Page 17: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

18

Page 18: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

19

Lệnh IF

Câu lệnh FOR

PASCALif a<> b then c=c+5;if a= b then z[i]:=0 else

beginz[i]:= z[i]+c;z[n-i]:=z[n-i]-c

end;C++

if (a!=b) c+=5;if (a==b)z[i]=0;

else{z[i]+=c;Z[n-i]-=c;

}

Đặt điềukiện trongngoặc

Lưu ý có ;

Lưu ý có ;

Không có then

PASCALfor i:=1 to n do

begin. . . .

end;for j:= n downto 1 dobegin

. . . .end;

C++for (i=1;i<=n;i++)

{. . . .

}for (i=n;i>0;i--)

{. . . .

}

Page 19: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

20

Lưu ý: Có thể khai báo biến i cục bộ hóa trong chu trình:

Tổ chức chu trình có số lần lặp không biết trước

Phần đầu chương trình

Ở PASCAL có thể có hoặc không có phần đầu chương trình:

Ở C++: bắt buộc phải khai báo các thư viện:

C++for (int i=1;i<=n;i++){ . . . }

for (int i=n;i>0;i--) { . . . }

PASCALrepeat. . . . .

until j=i;

while i<j dobegin

. . . .end;

C++do

{. . . .

} while (i==j);

while (i<j){. . . .

}

PASCALProgram NIM;Uses crt, matrix;

Khai báo thư viện

C++#include <fstream>#include <iostream>#include <string>

using namespace std;

Khai báo thư viện,thừa không sao!

Page 20: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

21

Tổ chức vào ra với file văn bản

PASCALConst tfi=’NIM.INP’;

Tfo=’NIM.OUT’;Var fi,fo:text;

. . . . . . .Assign(fi,tfi); reset(fi);Readln(fi,a,b,c);Close(fi);

. . . . . . .Assign(fo,tfo);Rewrite(fo);Writeln(fo,a,’ ‘,b);Write(fo,c);Close(fo);

C++ifstream fi (“NIM.INP”);ofstream fo (“NIM.OUT”);

. . . . . . . .fi>>a>>b>>c;fi.close();. . . . . . . .fo<<a<<” “<<b<<endl;fo<<c;fo.close();

Trong phần khai báo.Flies tự động được mở,

Page 21: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

22

Chương trình con và chương trình chính

Ví dụ:

Xử lý xâu

PASCALProcedure p1(i,j:integer);

Begin . . . End;Procedure p2;

Begin . . . End;Function fact(i:integer);integer;Begin. . . . . .

fact:=kEnd;

. . . . . .BEGIN

. . . .END.

C++void p1(int i,int j)

{ . . . . }void p2()

{ . . . . }int fact(int i)

{ . . .return(k);

}. . . . . . .int main(){ . . . .}

PASCALProgram NIM;Const tfi='NIM.INP';

tfo='NIM.OUT';

Var a:array[1..1000] of longint;i,n,g,t,k:longint;fi,fo:text;

BEGINassign(fi,tfi);reset(fi);readln(fi,n);for i := 1 to n do readln(fi,a[i]);close(fi);g:=0;for i:=1 to n do g:=g xor a[i];k:=0;for i:=1 to n dobegin

t:=a[i]-(a[i] xor g);if t>0 then

begininc(k);a[i]:=t

endelse a[i]:=0

end;assign(fo,tfo); rewrite(fo);writeln(fo,k);if k > 0 then

for i:=1 to n do if a[i]>0 thenwriteln(fo,i,' ',a[i]);

close(fo)END.

C++#include <fstream>#include <conio.h>#include <iostream>#include <stdlib.h>using namespace std;int main(){long n,g,t,k;ifstream fi ("NIM.INP");ofstream fo ("NIM.OUT");fi >> n;{long a[n+1];for (long i = 1; i <=n;i++)

fi>>a[i];k=0;g=0;for (long i=1; i <=n;i++) g^=a[i];if (g>0){ for (long i=1;i<=n;i++)

{ t = a[i] – (a[i]^g);if (t>0)

{k++;a[i]=t;} else a[i]=0;

}}

fo<<k<<endl;if (k>0)

for (long i= 1; i<=n;i++) if(a[i]>0) fo<<i << " "<<a[i]<<endl;

fi.close(); fo.close();}

}

Page 22: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

23

Xâu là một trong các loại dữ liệu cơ bản mà các hệ thống lập trình đều phải

cung cấp địch vụ để khai báo, lưu trữ và xử lý.

Cả trong PASCAL và C++ đều có 2 loại xâu:

Trong PASCAL:

Xâu kiểustring (ngắn và dài),

Xâu kiểu Pchar trong hệ thống lập trình Free Pascal,

Trong C++:

Xâu dạng C,

Xâu dạng C++.

Tồn tại một loạt các dịch vụ cung cấp các phép xử lý xâu loại 2 và chuyển

đổi dạng biểu diễn xâu. Các dịch vụ này được tổ chức trong thư viện Strings của

PASCAL và string của C++.

string s(“ABCD12345abcdABCDE2”);

string ns(“0123456789”);

l=s.size(); // l=s.length(); 19 l

k=s.find(“BC”); // 1 k (bắt đầu từ 0)

m=s.rfind(“BC”); // 14 m

p=s.find_first_of(‘C’); // 2 p

q=s.find_last_of(‘C’); // 15 q

i=s.find_first_of(ns); // 4 i

j=s.find_last_not_of(ns); // 17 j

Page 23: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

24

C++#include <fstream>#include <string>#include <iostream>using namespace std;int main(){ strings=("ABCD12345abcdABCDE2");

string ns=("0123456789");int l,k,m,p,q,i,j;ofstream fo ("xl_xau.out");

l=s.size();k=s.find("BC");m=s.rfind("BC");p=s.find_first_of('C');q=s.find_last_of('C');i=s.find_first_of(ns);j=s.find_last_not_of(ns);

fo<<"L = "<<l<<endl;fo<<"K = "<<k<<endl;fo<<"M = "<<m<<endl;fo<<"P = "<<p<<endl;fo<<"Q = "<<q<<endl;fo<<"I = "<<i<<endl;fo<<"J = "<<j<<endl;fo.close();

}

XL_XAU.OUT

L = 19K = 1M = 14P = 2Q = 15I = 4J = 17

Page 24: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

25

PASCAL cũng cung cấp những dịch vụ tương tự trong thư viện Strings. Dưới

đây là vài ví dụ nêu trong tài liệu hướng dẫn sử dụng của Free Pascal.

PASCAL

Program Example13 ;Uses s t r i n g s ;{ Program to demonstrate the StrScan and StrRScan f un c t i o n s . }Const P : PChar = ’ This i s a PCHAR s t r i n g . ’ ;S : Char = ’ s ’ ;beginWriteln ( ’P , s t a r t i n g from f i r s t ’ ’ s ’ ’ : ’ ,StrScan(P, s ) ) ;Writeln ( ’P , s t a r t i n g from l a s t ’ ’ s ’ ’ : ’,StrRScan (P, s ) ) ;end .

Find_first và Find_last

PASCAL

Program Example14 ;

Uses s t r i n g s ;

{ Program to demonstrate the StrLower and StrUpper f u n c t i o n s . }

Const P1 : PChar = ’THIS IS AN UPPERCASE PCHAR STRING ’ ;

P2 : PChar = ’ t h i s i s a lowercase s t r i n g ’ ;

begin

Writeln ( ’ Uppercase : ’ ,StrUpper (P2 ) ) ;

StrLower ( P1 ) ;

Writeln ( ’ Lowercase : ’ ,P1 ) ;

end .

Chữ hoa và chữ thường(có công cụ tương đương trong C)

Page 25: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

26

Như vậy, việc dùng PASCAL hay C++ đều có thể giải quyết một cách hiệu quảcác bài toán thi học sinh giỏi. Tuy vậy, trong mọi trường hợp, học sinh cần

được:

Trang bị thêm các kiến thức mới,

Có thói quen khai thác các công cụ trong hệ thống lập trình,

Biết cách sử dụng hợp lý và có hiệu quả các công cụ hiện có.

Đã là một công dạy và học, tại sao ta không làm việc ngay với C++? Điều này là

hoàn toàn khả thi và có lợi vì:

Về mặt pháp lý:

Bộ Giáo dục cho phép sử dụng C/C++ trong kỳ thi,

Công cụ: cũng thuộc loại Open Sources (miễn phí),

Về thời gian:

02 tiết cho việc giới thiệu cách viết chương trình trên C++,

02 tiết cho việc làm quen với môi trường lập trình Dev C++,

Các kiến thức khác, nếu cần, trang bị dần trong suốt quá trình bồi dưỡng (theo

nguyên tắc “Mưa dầm thấm đất”),

Lợi ích:

PASCAL

Program Example15 ;

Uses s t r i n g s ;

{ Program to demonstrate the StrPos f u n c t i o n . }

Const P : PChar = ’ This i s a PChar s t r i n g . ’ ;

S : Pchar = ’ i s ’ ;

begin

Writeln ( ’ Pos i t ion of ’ ’ i s ’ ’ i n P : ’ , s i z e i n t ( StrPos (P,S))-s i z e i n t (P ) ) ;

end .

Tìm vị trí xâu con

Page 26: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

27

Thư viện chuẩn STL của C++ có nhiều dịch vụ cần thiếtvới học sinh (ví dụ nhưcác công cụ sắp xếp theo các giải thuật khác nhau, các công cụ tìm kiếm, tổ chức

stack, heap, xử lý vector, ma trận v. v. . .),

Tài liệu: rất phong phú,

Về mục tiêu chiến lược lâu dài:

Các kiến thức về kỹ năng lập trình sẽ được tận dụng triệt để trong tương lai khi

học sinh lên đại học và ra làm việc,

Đáp ứng yêu cầu về chiến lược đào tạo và nâng cao chất lượng Giáo dục của

nhà nước.

Tất nhiên PASCAL với hệ thống lập trình Free Pascal vẫn được sử dụng song

song như một tùy chọn cho những người yêu thích và vẫn hoàn toàn có thể đạt

kết quả cao trong các kỳ thi.

Các vấn đề cần lưu ý khi chuyển đổi công cụ

Trong thời gian đầu cần trợ giúp học sinh các vấn đề:

Các loại lỗi cú pháp thường gặp ở giai đoạn đầu,

Cách tạo file dữ liệu,

Kỹ thuật cục bộ hóa biến,

Khai thác giao diện của Dev C++ và các công cụ hiệu chỉnh,

Vấn đề biến đổi kiểu dữ liệu trong biểu thức,

Giới thiệu về sự tồn tại và tác dụng của một số thư viện trong STL.

Tránh trang bị dồn dập kiến thức mới, đặc biệt là về các thư viện. Phong cách

lập trình theo kiểu C++ sẽ tự động được hình thành dần theo thời gian, đúng với

tinh thần “Trăng đến rằm sẽ tròn”.

Các vấn đề này sẽ được xem xét ở các phần tiếp theo.

Page 27: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

28

CÔNG TÁC PHÁT HIỆN VÀ BỒI DƯỠNG ĐỘI TUYỂN TIN HỌC TẠITRƯỜNG THPT CHUYÊN LÊ HỒNG PHONG

Đỗ Phước Vận - Tổ Tin học, THPT chuyên Lê Hồng Phong TPHCM

Công tác phát hiện và bồi dưỡng Đội tuyển Tin học là một trong những

nhiệm vụ quan trọng của trường THPT chuyên Lê Hồng Phong

CÔNG TÁC PHÁT HIỆN HỌC SINH GIỎI TIN HỌC

Công tác phát hiện HSG tin học bao gồm hai việc chính:

-Tuyển sinh đầu vào lớp 10 chuyên tin

- Tổ chức giảng dạy và sàng lọc để chọn đội tuyển HSG Thành phố môn tin

học

Tuyển sinh đầu vào lớp 10 chuyên tin

-Tổ chức thi tuyển đầu cấp vào lớp 10 chuyên tin:

Vào khoảng cuối tháng 6 hàng năm, Sở Giáo Dục và Đào Tạo TPHCM tổchức tuyển sinh lớp 10 chuyên và không chuyên vào các trường:

THPT chuyên Lê Hồng Phong;

THPT chuyên Trần Đại Nghĩa;

THPT Nguyễn Thượng Hiền;

THPT Gia định

Và các trường THPT khác trong thành phố.

Riêng bộ môn Tin học thường có khoảng 100 học sinh lớp 9 tham gia thi

tuyển vào lớp 10 chuyên tin trường THPT chuyên Lê Hồng Phong.

Đối tượng tham gia kỳ thi tuyển là các học sinh lớp 9 có học lực giỏi, hạnh

kiểm tốt. Riêng điểm toán phải từ 8 trở lên.

Số học sinh trúng tuyển hàng năm từ 20 đến 30 học sinh.

-Tổ chức thi tuyển vào lớp 10 chuyên tin dành cho các học sinh lớp không

chuyên vừa trúng tuyển lớp 10:

Page 28: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

29

Với mục đích mở rộng đối tượng tham gia vào lớp 10 chuyên tin, ngay sau

khi nhập học, nhà trường có tổ chức thi tuyển vào lớp các lớp 10 chuyên dành

cho các học sinh vừa trúng tuyển lớp 10 không chuyên và có nguyện vọng học

lớp chuyên tin.

Đề thi tuyển do tổ Tin học của nhà trường thực hiện với mục tiêu chỉ tuyển

những học sinh có đủ năng lực theo học các lớp chuyên.

Thông thường hàng năm tuyển thêm được 1 hoặc 2 học sinh từ các lớp

không chuyên.

Giảng dạy và sàng lọc để chọn đội tuyển HSG Thành phố môn tin học

Việc giảng dạy và sàng lọc được thực hiện ở cả 3 khối lớp.

-Lớp 10Ctin:

+Thời gian học: 6 tiết/tuần.

+Tổ chức Thi tuyển để chọn đội tuyển HSG tham dự kỳ thi Olympic truyền

thống 30-4 các tỉnh phía nam:

Đầu tháng hai hàng năm, nhà trường tổ chức thi tuyển chọn ra đội tuyển

Olympic 30-4 khối lớp 10 gồm 3 thành viên chính thức và 2 thành viên dự bị.Đối tượng dự tuyển là học sinh lớp 10 chuyên tin.

-Lớp 11Ctin:

+Thời lượng: 6 tiết/tuần.

+ Tổ chức Thi tuyển để chọn đội tuyển HSG tham dự kỳ thi Olympic

truyền thống 30-4 các tỉnh phía nam:

Đầu tháng hai hàng năm, nhà trường tổ chức thi tuyển chọn ra đội tuyển

Olympic 30-4 khối lớp 11 gồm 3 thành viên chính thức và 2 thành viên dự bị.Đối tượng dự tuyển là học sinh lớp 11 chuyên tin.

+Toàn thể học sinh lớp 11 chuyên tin được tham dự kỳ thi chọn ĐỘI

TUYỂN HSG THÀNH PHỐ MÔN TIN HỌC tham dự kỳ thi học sinh giỏi Tòan

quốc.

-Lớp 12Ctin:

+Thời lượng :

Page 29: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

30

Học kỳ I :6 tiết/tuần.

Học kỳ II: 2 tiết/tuần.

+Nội dung chương trình học theo quy định của Bộ Gáo dục và đào tạo.

+ Toàn thể học sinh lớp 12 chuyên tin được tham dự kỳ thi chọn ĐỘI

TUYỂN HSG THÀNH PHỐ MÔN TIN HỌC tham dự kỳ thi học sinh giỏi Tòan

quốc.

CÔNG TÁC BỒI DƯỠNG ĐỘI TUYỂN TIN HỌC

Công tác bồi dưỡng đội tuyển tin học bao gồm 3 việc chính:

Dạy bồi dưỡng chung cho tất cả học sinh các lớp chuyên nhằm nâng cao

trình độ chung của học sinh lớp chuyên tin, góp phần trong công tác đào tạo

nguồn nhân lực chất lượng cao của thành phố. Việc dạy bồi dưỡng chung được

thực hiện trong suốt năm học.

Dạy bồi dưỡng đặc biệt cho ĐỘI TUYỂN HSG môn Tin học THÀNH

PHỐ HCM lập thành tích trong kỳ thi HSG Toàn quốc. Việc dạy bồi dưỡng Đội

tuyển được thực hiện trong 8 tuần trước ngày thi Học sinh giỏi Toàn quốc.

Dạy bồi dưỡng đặc biệt cho ĐỘI TUYỂN Olympic 30-4 môn Tin học

tham gia kỳ thi Olympic truyền thống 30/4 các tỉnh phía nam. Việc dạy bồi

dưỡng Đội tuyển Olympic 30-4 được thực hiện trong 6 tuần trước ngày thi

Olympic truyền thống 30/4 các tỉnh phía nam.

Chi tiết cụ thể như sau:

Dạy bồi dưỡng chung cho tất cả học sinh các lớp chuyên

-Đội ngũ Giáo viên:

Đội ngũ giáo viên giảng dạy các lớp chuyên là các giáo viên được tuyển

chọn từ các giáo viên tin học thuộc biên chế trong nhà trường.

-Nội dung chương trình giảng dạy:

Nội dung chương trình học theo quy định của Bộ Gáo dục và đào tạo.

-Tài liệu tham khảo: Bao gồm sách giáo khoa của Bộ, các sách tham khảo

của một số trường Đại học Việt Nam và các nguồn tài liệu trên Internet.

-Công tác rèn luyện đạo đức tư tưởng cho HS các lớp chuyên:

Page 30: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

31

Ngoài việc giảng dạy kiến thức chuyên môn, các học sinh lớp chuyên cũngthường xuyên được rèn luyện đạo đức tư tưởng như các học sinh khác.

Dạy bồi dưỡng đặc biệt cho ĐỘI TUYỂN HSG THÀNH PHỐ

-Đội ngũ Giáo viên: Gồm 02 giáo viên giỏi môn tin học của trường Lê

Hồng Phong và 1 chuyên viên bộ môn tin học của Sở Giáo dục và Đào tạo

TPHCM.

-Nội dung chương trình giảng dạy:

Gồm các chuyên đề và các bài tập chuyên sâu về các thuật toán, các đề thi

học sinh giỏi toàn quốc môn tin học của Việt nam và một số nước khác.

-Thời lượng: 12 tiết/ tuần.

-Kết quả thi HSG toàn quốc môn Tin học một số năm gần đây:

Năm học Số giải HSG toàn quốc

2010-201104

(1 giải nhì, 1 giải ba và 2 giải khuyến khích)

2009-201004

(1 giải ba và 3 giải khuyến khích)

2008-2009 02 giải ba

2007-200805

(1 gỉai nhì, 1 giải ba và 3 giải khuyên khích)

2006-200702

( 1 giải ba, 1 giải khuyến khích)

Dạy bồi dưỡng đặc biệt cho ĐỘI TUYỂN Olympic 30-4

-Đội ngũ giáo viên: Gồm tất cả giáo viên có dạy lớp chuyên tin.

Page 31: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

32

-Nội dung chương trình giảng dạy:

Gồm các chuyên đề và các bài tập chuyên sâu về các thuật toán.

-Thời lượng: 12 tiết/tuần.

- Kết quả thi Olympic truyền thống 30/4 các tỉnh phía nam một số năm gần

đây:

Năm học Số huy chương

2010-201105

( 01 vàng , 02 bạc, 02 đồng)

2009-201006

( 04 vàng , 02 bạc)

2008-200906

( 05 vàng , 01 bạc)

2007-200806

( 06 vàng)

2006-200706

( 2 vàng, 2 bạc, 2 đồngg)

MỘT SỐ KINH NGHIỆM VỀ BỒI DƯỠNG ĐỘI TUYỂN HỌC SINH

GIỎI

Chia nhỏ các bài tập khó, phức tạp thành những bài tập đơn giản, dễ hơn.

Các bài tập dành cho đội tuyển học sinh giỏi thường rất phức tạp và khó.

Các bài tập này thường làm cho một số học sinh nản chí, mất hứng thú học tập.

Có thể khắc phục việc này bằng cách chia nhỏ các bài tập phức tạp, khó thành

nhiều bài đơn giản hơn, dễ hơn. Sau khi học sinh làm xong những bài toán đã

chia nhỏ, giáo viên mới yêu cầu học sinh làm bài tập phức tạp.

Page 32: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

33

Thường xuyên động viên tinh thần cho các học sinh trong đội tuyển học

sinh giỏi

Ban giám hiệu thường xuyên có phần thưởng vật chất cũng như tuyêndương trước toàn thể nhà trường những học sinh trong đội tuyển học sinh giỏi,

đặc biệt là các học sinh có thành tích trong các kỳ thi học sinh giỏi thành phố,

toàn quốc và Olympic 30-4 các tỉnh phía nam.

Cần có chế độ ưu đãi cho học sinh trong các đội tuyển học sinh giỏi.

Việc tham gia học tập trong các đội tuyển thường mất nhiều thời gian và

công sức của học sinh, làm ảnh hưởng đến kết quả học tập các môn khác của các

em. Vì vậy cần có chế độ đặc biệt để giúp các em vượt qua những khó khăn này.

Tại trường THPT chuyên Lê Hồng Phong, các học sinh trong đội tuyển

thường được các ưu đãi sau đây:

-Được miễn thi học kỳ và được hưởng điểm cao nhất của mỗi môn.

-Sau khi thi học sinh giỏi toàn quốc, Ban giám hiệu phân công một số giáo

viên có kinh nghiệm để giúp các học sinh trong đội tuyển học và ôn tập các môn

khác một cách hiệu quả nhất, theo một thời khóa biểu riêng biệt.

Page 33: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

34

GIẢI BÀI TOÁN TỐI ƯU TỔ HỢP BẰNG PHƯƠNG PHÁP DUYỆT

Nguyễn Thị Hợp Trường THPT Chuyên Bắc Giang

Trong chương trình toán học phổ thông học sinh đã được học rất chi tiết vềcác cấu hình tổ hợp như: hoán vị, chỉnh hợp lặp, chỉnh hợp không lặp, tổ hợp.

Trên cơ sở đó, ngay sau khi học sinh nắm được các kiến thức căn bản của một

ngôn ngữ lập trình, giáo viên có thể dạy ngay “phương pháp duyệt”.

Đây là một trong những phương pháp dễ hiểu nhất đối với học sinh và có

thể áp dụng để giải rất nhiều bài toán tối ưu với dữ liệu nhỏ (thường đạt 50%

đến 60% số test của một bài thi).

BÀI TOÁN TỐI ƯU TỔ HỢP

Phát biểu bài toán: Có nhiều bài toán mà việc giải nó đưa về việc duyệt các

cấu hình tổ hợp thoả mãn các điều kiện nào đó. Với mỗi cấu hình tổ hợp, ta sẽtính toán theo một cách nào đó (tuỳ theo yêu cầu của bài toán) để được một giá

trị bằng số. Giá trị đó thể hiện giá trị sử dụng của cấu hình (gọi là giá của cấu

hình hay giá của phương án).

Bài toán đặt ra: “Trong số các cấu hình tổ hợp chấp nhận được, hãy lựa

chọn một cấu hình có giá trị sử dụng tốt nhất (lớn nhất hoặc nhỏ nhất”

Các bài toán như vậy gọi là “Bài toán tối ưu tổ hợp”.

Phương án và giá của phương án

Mỗi cấu hình tổ hợp gọi là một phương án của bài toán (hay còn gọi là một

lời giải của bài toán). Với mỗi phương án của bài toán ta tính toán được một con

số gọi là giá của phương án.

Hàm mục tiêu của bài toán

Nếu ta gọi tập các phương án của bài toán là D.

Khi đó, với mỗi phương án x thuộc D cho tương ứng một giá trị số duy

nhất với nó. Do đó xác định một hàm số:

f : D R

x y=f(x)

Page 34: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

35

Hàm f(x) như vậy gọi là hàm mục tiêu của bài toán

Vậy: Bài toán tối ưu tổ hợp là bài toán:

“Tìm Max{f(x)| xD}” hoặc “Tìm Min{f(x)| |xD}”, với D là tập các

phương án của bài toán.

Giá trị tối ưu và phương án tối ưu

Một phương án x*D mà tại đó f(x*) đạt giá trị min hoặc max gọi là

phương án tối ưu của bài toán.

Giá trị f(x*) gọi là giá trị tối ưu của bài toán. Như vậy:

Với bài toán tìm max thì: f(x*) lớn hơn hoặc bằng f(x) với mọi x thuộc D;

Với bài toán tìm min thì: f(x*) nhỏ hơn hoặc bằng f(x) với mọi x thuộc D;

Chú ý:

Giá trị tối ưu của bài toán là duy nhất.

Phương án tối ưu của bài toán có thể có nhiều

PHƯƠNG PHÁP DUYỆT GIẢI BÀI TOÁN TỐI ƯU

Tư tưởng chủ đạo:

Lần lượt duyệt các cấu hình của bài toán. Đối với mỗi cấu hình thoả mãn

điều kiện của bài toán (mỗi phương án của bài toán) ta đi tính giá của phương ánđó. So sánh giá của tất cả các phương án với nhau để tìm ra phương án tối ưu vàgiá trị tối ưu.

Trong quá trình duyệt ta luôn giữ lại phương án tốt hơn. Phương án tốt nhất

cho đến thời điểm đang duyệt gọi là phương án mẫu. Giá trị của phương án mẫu

gọi là kỷ lục tạm thời.

Khi duyệt xong tất cả các phương án thì sẽ tìm được phương án tối ưu vàgiá trị tối ưu.

Tuy nhiên, trên thực tế với những bài toán có kích thước lớn (số phương ánnhiều) thì thời gian duyệt lâu dẫn đến không khả thi. Do đó, trong quá trình

duyệt ta nên hạn chế bớt phép duyệt (không duyệt các phương án mà ta đã biết

chắc chắn rằng phương án đó không thể là phương án tối ưu của bài toán).

Page 35: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

36

Có hai cách duyệt:

Duyệt toàn bộ (vét cạn)

Duyệt hạn chế (phương pháp duyệt có đánh giá nhánh cận)

Phát biểu bài toán tối ưu tổ hợp bằng cách khác:

Tìm MAX{f(x), x thuộc D} hoặc Tìm MIN{f(x), x thuộc D}

trong đó:

+) D = {x| x=(x1,x2, ..., xn) A1 × A2 ×... ×An ; x thoả mãn tính chất P}

+) A1 , A2 ,... ,An là các tập hữu hạn phần tử.

+) Ai là tập gồm các khả năng đề cử cho thành phần xi

Phương pháp duyệt viết dưới dạng mô hình quay lui có cấu trúc tổng quát

như sau:

Procedure Khởitạo;

begin

Đọc dữ liệu vào

Khởi tạo các giá trị ban đầu cho các biến

end;

Procedure Cập Nhật Kỷ Lục;

begin

- <Tính giá phương án nếu chưa tính>

- IF giá p/án > kỷ lục (hoặcp/án > kỷ lục) then

begin

kỷ lục := giá p/án;

giữ lại p/án;

end;

end;

Procedure Try(k : integer);

Page 36: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

37

begin

for ak Ak do

if <chấp nhận ak> then

begin

xk := ak;

<Tính giá của phương án bộ phận cấp k;>

<Xác định trạng thái mới của bài toán nếu cần>

if k = n then <Cập Nhật Kỷ Lục>

else try(k+1);

<Hoàn nguyên trạng thái của bài toán nếu cần>

end;

end;

Procedure Inkq;

begin

<in kỷ lục và phương án tối ưu>

end;

BEGIN

Khởitạo;

Try(1);

inkq;

END.

BÀI TẬP ÁP DỤNG

Bài 1 : Truyền tin (Đề thi chọn HSG QG bảng B năm 2002)

Người ta cần truyền n gói tin được đánh số từ 1 đến n từ một điểm phát đến

một điểm thu. Để thực hiện việc truyền tin có thể sử dụng m đường truyền được

đánh số từ 1 đến m. Biết rằng nếu truyền j gói tin theo đường truyền tin i thì chi

phí phải trả là sij (sij là số nguyên dương, sij < 32767, i =1,2,..,m, j = 1,2,…,n).

Page 37: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

38

Yêu cầu: Hãy xác định số lượng gói tin cần truyền theo mỗi đường truyền

tin để việc truyền n gói tin được thực hiện với tổng chi phí phải trả là nhỏ nhất.

Dữ liệu: Vào từ file văn bản TTIN1.INP:

+ Dòng đầu tiên chứa hai số nguyên dương n và m (n,m < 100) .

+ Dòng thứ i trong số m dòng tiếp theo chứa n số nguyên dương si1, si2, ..,

sin , i=1,2,…,m.

Kết quả: Đưa ra file văn bản TTIN1.OUT:

+ Dòng đầu tiên chứa S là tổng chi phí phải trả theo cách truyền tin tìm

được.

+ Dòng thứ hai chứa m số nguyên không âm q1, q2, .. ,qm, trong đó qi là sốgói tin cần truyền theo đường truyền tin i.

Ví dụ:

TTIN1.INP TTIN1.OUT

3 3

20 20 20

4 3 10

1 3 20

4

0 2 1

*Ý tưởng thuật toán:

Mỗi 1 đường truyền k (k=1,2,..,m) có thể truyền j gói tin (j=0,1,2,..,n-t, t là

tổng các gói tin đã truyền trên i-1 đường truyền trước).

Do đó, mỗi một phương án truyền tin là một chỉnh hợp lặp chập m của n-

t+1 phần tử {0,1,..,n-t} có dạng q = (q1, …, qm).

Giá của phương án f(q) = ],[1

m

iiqiS

Bài toán đưa về bài toán tối ưu tổ hợp: “Tìm Min{f(q)| x D} với D là tập

các chỉnh hợp lặp chập m của n-t+1 phần tử”

Bài 2 : Thuê máy

Page 38: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

39

Một trung tâm có n máy tính (cấu hình giống nhau) dùng để cho thuê trong

tháng (từ ngày 1 đến ngày 31), thời gian thuê tính theo đơn vị ngày. Đầu tháng,

trung tâm nhận được yêu cầu của m khách hàng (đánh số từ 1 đến m), mỗi khách

hàng cần thuê một máy trong một số ngày nào đấy thuộc tháng. Giả thiết rằng,

đối với mỗi khách hàng, hoặc trung tâm từ chối, hoặc trung tâm đồng ý cho thuê

theo đúng như yêu cầu của khách. Với mỗi ngày, gọi tần số sử dụng máy là sốmáy túnh được sử dụng trong ngày đó. Hãy lập một phương án cho thuê máy đểtổng tần số sử dụng máy trong tháng là lớn nhất.

Dữ liệu: Vào từ file văn bản THUEMAY.INP gồm:

+ Dòng đầu ghi các giá trị n, m.

+ m dòng tiếp theo, theo thứ tự 1, 2,…,m, mỗi dòng ghi yêu cầu của một

khách: bắt đầu là số ngày mà khách cần thuê, tiếp theo là các ngày trong tháng

mà khách cần thuê. Các giá trị trên cùng một dòng ghi cách nhau ít nhất một dấu

trắng.

Kết quả: Đưa ra file văn bản THUEMAY.OUT:

+ Dòng đầu ghi số khách được thuê.

+ Dòng tiếp theo ghi các số hiệu khách được thuê, các số hiệu này phân

cách nhau ít nhất một dấu trắng.

+ Dòng cuối ghi tổng tần số sử dụng máy.

Hạn chế kích thước: số máy, số khách không vướt quá 30

Ví dụ:

THUEMAY.INP THUEMAY.OUT

3 10

5 1 3 4 6 7

1 1

2 3 6

3 2 4 5

6

1 2 6 8 9 10

20

Page 39: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

40

6 1 2 3 4 5 6

2 2 3

5 1 3 4 6 7

5 2 4 5 6 7

4 1 2 4 5

3 3 5 6

*Ý tưởng thuật toán:

- Mỗi phương án cho thuê máy tính là một dãy nhị phân độ dài m,

x=(x1,x2,..,xm), xi{0,1}, i=1,2,..,m

- Điều kiện chấp nhận x là:

m

i 1

ngay[i,j]*x[i] < n, j=1..31

- Giá của phương án: f(x)= ixisnm

i

*1

Duyệt các dãy nhị phân độ dài m, kiểm tra các dãy là phương án của bài

toán, so sánh giá của các phương án với nhau để tìm phương án có giá lớn nhất.

KẾT LUẬN

Có rất nhiều bài toán tin hay có thể dùng “Phương pháp duyệt cấu hình tổhợp” để giải. Trong giới hạn bài viết này tôi đã trình bày cách thức tiếp cận và

cấu trúc chương trình tổng quát để giải các bài toán bằng phương pháp duyệt.

Rất mong được sự góp ý của bạn đọc!

Page 40: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

41

PHÁT HIỆN VÀ XÂY DỰNG ĐỘI TUYỂN QUỐC GIA

Trường THPT Chuyên Thăng Long, Lâm Đồng

Học sinh giỏi đoạt giải quốc gia và quốc tế chính là những hạt nhân tốt của

phong trào thi đua học tốt, là tài sản quý báu của quốc gia. Để có một học sinh

đủ khả năng toả sáng trên đấu trường trí tuệ, đằng sau đó là cả một quá trình tìm

kiếm và “mài giũa” từ khi ngọc nằm trong đá.

Từ khi Bộ Giáo dục - Đào tạo bỏ quy định tuyển thẳng đại học, cao đẳng

đối với học sinh đạt giải Quốc gia, nhiều bậc phụ huynh học sinh không thích

con tham gia đội tuyển học sinh giỏi vì sợ mất nhiều thời gian tập trung cho 1

môn mà sao nhãng những môn học khác. Nhiều học sinh học ở đội tuyển một

thời gian rồi xin thôi học, có trường hợp cha mẹ lên tận nơi xin cho con ra khỏi

đội tuyển để tập trung ôn thi đại học, có thầy, cô giáo dạy đội tuyển được một

thời gian thì xin thôi, không dạy nữa (vì đầu tư nhiều mà không hiệu quả kinh

tế) … Điều đó chứng tỏ một số giáo viên, học sinh và phụ huynh đều chưa nhận

thức đúng về vị trí và tầm quan trọng của công tác bồi dưỡng học sinh giỏi trong

nhà trường.

Trước tình hình đó, nhà trường đã có nhiều biện pháp tuyên truyền để mọi

người thấy rõ việc bồi dưỡng học sinh giỏi cần có sự ủng hộ, hợp tác tích cực

của tập thể sư phạm, cha mẹ học sinh. Đây cũng là trách nhiệm của nhà trường,

của mỗi giáo viên, vì vậy kết quả dạy học sinh giỏi là một trong những tiêu chí

để đánh giá xếp loại thi đua trong năm học.

Việc lựa chọn đội tuyển học sinh giỏi luôn được nhà trường chú trọng và

quan tâm phát hiện ngay từ khi các em thi tuyển vào lớp 10. Để tuyển chọn

chính xác, nhà trường đã căn cứ vào nhiều thông tin, phát hiện tuyển chọn đúngnhững tài năng thực sự. Việc tổ chức, phát hiện, tuyển chọn học sinh giỏi được

nhà trường phân công cho từng giáo viên, để giáo viên đưa vào kế hoạch công

tác của mình và có kế hoạch bàn giao cho giáo viên kế cận năm sau.

Trên cơ sở có một sự tuyển chọn chặt chẽ, kỹ lưỡng, nhà trường tiến hành

xây dựng kế hoạch bồi dưỡng học sinh giỏi, dựa trên những mặt mạnh, mặt yếu

của đội tuyển, giáo viên, cơ sở vật chất, tài chính… Kế hoạch của nhà trường

Page 41: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

42

trong nhiều năm đã đảm bảo tính khả thi, không để xảy ra tình trạng dạy dồn ép

vào thời gian cuối trước khi thi và không có phần tự học cho học sinh.

Biện pháp quan trọng nhất được nhà trường xác định đó chính là việc chỉđạo phân công và bồi dưỡng giáo viên. Nếu phân công giáo viên dạy đội tuyển

một khối cố định trong nhiều năm (phân công chuyên) sẽ có ưu điểm giáo viên

có điều kiện nghiên cứu sâu kiến thức, có kinh nghiệm và đảm bảo sự ổn định

thành tích. Tuy nhiên, cách phân công này có nhược điểm là giáo viên không có

được cái nhìn tổng thể, xuyên suốt chương trình. Không tạo cơ hội cho giáo viên

mới vào nghề có thể dạy học sinh giỏi. Khắc phục tình trạng này, những nămgần đây Trường đã phân công giáo viên theo hướng phối hợp cả hai cách “phâncông chuyên và luân phiên”. Điều này có ý nghĩa dự trữ và bồi dưỡng đội ngũkế cận, nhất là khi lực lượng giáo viên trẻ chiếm đa số.

Để làm tốt công tác bồi dưỡng học sinh giỏi, nhà trường cũng quan tâm đến

việc bồi dưỡng đội ngũ giáo viên về tư tưởng, phẩm chất chính trị, đạo đức nghềnghiệp, năng lực chuyên môn, kinh nghiệm thực tế, trong đó năng lực chuyên

môn là khâu quan trọng. Nhà trường đã biết khai thác vai trò đầu tàu của những

giáo viên giàu kinh nghiệm. Chính vì thế, đến nay nhà trường đã có một đội ngũgiáo viên bồi dưỡng đội tuyển học sinh giỏi với bề dày thành tích, tâm huyết với

nghề.

Nhà trường xác định, việc dạy học sinh giỏi khác với việc dạy đại trà, vì

vậy nhà trường đã thường xuyên tổ chức các buổi hội thảo về cách dạy trên lớp,

cách rèn phương pháp tư duy, cách kiểm tra đối với các môn xã hội, môn tựnhiên… Thông qua các buổi hội thảo, giáo viên phải thấy rõ nhiệm vụ chính của

họ là giúp học sinh có khả năng phát hiện, suy đoán và tự giải quyết vấn đề.

Cùng với những quan tâm về đội ngũ, nhà trường cũng quan tâm đầu tư vềcơ sở vật chất như: Xây dựng kho tư liệu, tài liệu tham khảo, thiết bị dạy học.

Hằng năm nhà trường đều mua sắm thêm tài liệu, sách tham khảo đảm bảo giáo

viên và học sinh trong đội tuyển có đủ sách học tập và tham khảo.

Nhiều kinh nghiệm trong công tác bồi dưỡng chất lượng giáo dục mũi nhọn

của nhà trường cần được nhân rộng và phát huy hơn nữa. Bên cạnh đó, việc đẩy

mạnh xã hội hoá giáo dục, công tác thi đua khen thưởng đã góp phần không nhỏtrong việc tạo nên một đội ngũ giáo viên giỏi, học sinh giỏi nhiều năm cho nhà

Page 42: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

43

trường. Thông qua công tác xã hội hoá giáo dục, cha, mẹ, các đoàn thể, tổ chức

xã hội đã cùng vào cuộc quan tâm, khuyến khích động viên, hỗ trợ kinh phí cho

các em ôn thi đội tuyển.

Trường THPT Chuyên Thăng Long – Đà Lạt có quy định riêng là vào

những buổi chiều trong tuần, học sinh sẽ học nâng cao theo chuyên đề của

chương trình chuyên. Là một giáo viên có hơn 10 năm kinh nghiệm dạy đội

tuyển học sinh giỏi của trường và của tỉnh thi HSG quốc gia, tôi trăn trở rất

nhiều về công tác bồi dưỡng học sinh. Đây là bài toán dài hơi mà tài lực và

nguồn lực phải song hành: “Phải mất 6 – 7 năm để đào tạo ra một giáo viên trẻđủ sức dạy học sinh chuyên nhưng khi đứng được lớp chuyên, thu nhập lại thua

xa khi đi luyện thi đại học hay day các lớp bên ngoài; trong khi trách nhiệm lại

nặng nề và công sức đầu tư gấp nhiều lần. Để soạn giáo án đứng lớp chuyên một

buổi phải mất mấy ngày, tìm bài tập nâng cao, kiến thức mới”.

Tại Trường THPT Chuyên Thăng Long – một trong những “lò” cho ra đời

nhiều học sinh đoạt giải quốc gia của tỉnh Lâm Đồng, việc phát hiện và bồi

dưỡng học sinh giỏi là quá trình đầu tư nhiều công sức, đòi hỏi thầy cô có tay

nghề cao và phải thật sự tâm huyết. Chương trình phát hiện và bồi dưỡng học

sinh như tìm ngọc trong đá, “các em giống như những viên đá còn thô, có tốchất thông minh và sự say mê học chuyên nhưng phải được mài giũa, truyền lửa

thì ngọc mới tinh và toả sáng. Tất nhiên, điều đó không thể làm trong một sớm

một chiều mà cần có thời gian và đầu tư bài bản, dài hơi.

Một trong những “bí quyết” để bồi dưỡng và chọn lọc những học sinh ưutú nhất. Ngay khi vượt qua kỳ tuyển sinh, các em đặt chân vào trường sẽ được

học các lớp chuyên đề nâng cao. Qua đó, những học sinh tiềm năng sẽ được

tuyển chọn và bồi dưỡng ở những lớp chuyên sâu. Với những bước đi chắc chắn,

khoa học.

TP Đà Lạt là trung tâm chính trị, văn hóa của tỉnh, do đó độ nhạy cảm

trong việc tiếp nhận thông tin khá cao. Người dân đặc biệt quan tâm đến chất

lượng học tập của con em mình nhưng thường hướng con em học theo kiểu thực

dụng: Học để thi đỗ vào thi đỗ vào ĐH, CĐ. Chính vì vậy, ngay từ THCS, các

em học sinh đã được định hướng theo kiểu học phân luồng, chú trọng những

môn Toán, Lý, Hóa nâng cao, còn những môn như Sinh, Sử, Địa ... ít em theo

Page 43: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

44

học. Nhiều em có năng lực, đạt kết quả cao trong học tập và được chọn vào đội

tuyển thì phụ huynh học sinh lại tha thiết xin cho con em mình ra khỏi đội tuyển.

Nhiều học sinh có lực học giỏi nhưng không dốc toàn tâm, toàn lực vào làm bài,

bài làm hời hợt vì không muốn vào đội tuyển HSG. Khi công bố kết quả điểm

thi HSG thấp, nhiều em tỏ ra thờ ơ, không quan tâm ....

Kết quả thi HSG những năm trước của tỉnh Lâm Đồng thấp còn do yếu tốgiáo viên. Quả thực, không có thầy giỏi thì khó có trò giỏi. Đội ngũ giáo viên

giỏi của trường chuyên Thăng Long đóng vai trò nòng cốt trong công tác phát

hiện và bồi dưỡng HSG của tỉnh bị thất thoát đáng kể: Nghỉ hưu, chuyển công

tác, và cá biệt như bộ môn Tin Học là chuyển đổi bộ môn giảng dạy sang Toán

vì giảng dạy bộ môn Tin Học không kinh tế (thu nhập thấp) ... tỉnh Lâm Đồng

tuyển giáo viên có năng lực cho bộ môn mấy năm qua rất khó khăn. Những giáo

viên giỏi có xu hướng chuyển công tác vào các trường đại học cao đẳng và các

thành phố lớn công tác (một số giáo viên khi hoàn thành chương trình đào tạo

thạc sĩ hay NCS đã chuyển công tác), ở đó thu nhập của họ cao gấp cả chục lần

ở quê nhà. Biết được điều đó nhưng “lực bất tòng tâm”, khả năng tài chính của

tỉnh Lâm Đồng nói chung, TP Đà Lạt nói riêng còn rất hạn chế để có thể giữchân người tài.

Về phía học sinh, nhiều em không muốn vào đội tuyển HSG vì sợ học lệch

sẽ trượt tốt nghiệp THPT, ĐH và CĐ . Ngoài ra, các đội tuyển Tin Học không

thu hút được học sinh, bởi một lẽ đơn giản: Những môn Tin Học không phục vụcho kỳ thi ĐH, một kỳ thi quyết định số phận của cả cuộc đời học sinh đang ởphía trước.

Một số yêu cầu cơ bản trong phát hiện bồi dưỡng HSG:

Đối với giáo viên:

1. Chọn học sinh thông minh, nhanh nhẹn, và yêu thích bộ môn ( đối với bộmôn Tin Học kiếm học sinh thông minh thì khó lắm vì những môn khác họ lấy

cả rồi). Giáo viên phải tạo được niềm tin cho học sinh về chuyên môn, nhiệt tình

và sự say mê sáng tạo của mình (nếu không có những điều kiện này thì làm sao

giáo viên có thể thuyết phục truyền nguồn cảm hứng say mê chuyên môn cho

học sinh được? Bản thân giáo viên phải luôn khiêm tốn, Luôn tìm các mới trong

tư duy của học sinh giúp đỡ phát triển hoàn chỉnh ).

Page 44: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

45

2. Phối hợp với BGH, gia đình học sinh giúp đỡ học sinh trong tìm tài liệu,

thời gian học (mỗi vùng miền, mỗi trường và mỗi gia đình có chủ trương riêng,có cách điều chỉnh và định hướng con em mình theo 1 chiều hướng nhất định).

3. Hướng dẫn cụ thể từng bài từng dạng bài tập, cho học sinh làm đi làm lại

(lớp các bài toán tương tự) nhiều lần để hình thành kỹ năng, kiểm tra học sinh

thường xuyên để xác định tình hình học tập như: thuộc bài chưa, hiểu bài không,

còn chưa nắm vấn đề bài học chổ nào, và cần bổ sung kiến thức phần nào để có

thể tự bản thân tư duy, tự học, tự tìm kiếm kiến thức, tự kiểm tra và đánh giátrình độ bản thân.

4. Thường xuyên trao đổi với học sinh, hướng dẫn phương pháp tự học, tìm

tài liệu, và xây dựng niềm tin, ý trí phấn đấu cao trong học tập. Từ đó kích thíchlòng say mê, sáng tạo của học sinh.

5. Dạy theo các chuyên đề, tách thành chủ đề chủ điểm càng cụ thể càng

tốt, thực hành và lý thuyết luôn gắn kết chặc chẽ đồng thời luôn có những kiến

thức nâng cao, mở rộng để học sinh xây dựng lối tư duy phát triển vấn đề một

cách lôgic của bản thân do đó học sinh có thể nắm bắt vấn đề rõ hơn, nhớ lâu

hơn, và có thể sáng tạo cách giải quyết vấn đề bài toán theo hướng mới mà bản

thân học sinh suy nghĩ ra.

Đối với học sinh:

1. Yêu cầu học sinh phải nắm vững về ngôn ngữ lập trình Free Pascal hay

ngôn ngữ khác.

2. Nắm bắt các thuật toán để giải các dạng toán thường gặp trong các đề thi

Tin học trên toàn quốc mà giáo viên hướng dẫn (thông qua tất cả những phươngtiện và những bài giảng của giáo viên mà mình có thể tiếp thu được).

3. Với phương châm: Đừng bao giờ viết chương trình mà chưa suy xét kỹvề giải thuật và những dữ liệu cần thao tác. Do đó thường xuyên chạy thửchương trình Pascal bằng tay. Yêu cầu phân tích, nêu kết quả từng câu lệnh.

4. Nên giải một bài toán bằng nhiều thuật toán (ví dụ: sắp xếp dãy số có

nhiều thuật toán), sau đó nêu ưu khuyết điểm từng thuật toán; so sánh và chọn

thuật toán tối ưu nhất.

Page 45: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

46

5. Thực hiện các bài tập với đúng hạn định thời gian của giáo viên quy

định, và tự làm các bài tập không sao chép.

Page 46: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

47

LUỒNG CỰC ĐẠI DÒNG CHẢY TRONG MẠNG LƯỚI

Trường THPT Chuyên Nam Định

I. MỤC ĐÍCH, YÊU CẦU

- Học sinh nắm được vấn đề cốt lõi của thuật toán tìm luồng cực đại mà

không phải chỉ biết cài đặt theo thuật toán mà giáo viên cung cấp.

- Cài đặt được thuật toán

II. KIẾN THỨC CHUẨN BỊ

- học sinh nắm chắc và cài đặt được thủ tục thăm theo chiều rộng.

III. NỘI DUNG:

1. Bài toán đặt ra:

Bài toán ví dụ: Mạng lưới gồm các ống dẫn dầu với nhiều kích cỡ khác

nhau được nối lại rất đa dạng với các công tắc điều khiển hướng đi của dầu

trong ống tại các điểm nối. Giả sử mạng lưới có một nơi bắt nguồn và một nơikết thúc (đủ lớn) cho tất cả các ống dẫn nối tới chúng. Làm thế nào để lượng

dầu chuyển được từ nơi bắt nguồn tới nơi nhận là nhiều nhất?

Bài toán luồng cực đại trong mạng:

Cho mạng G = (V,E). Hãy tìm luồng f* trong mạng với giá trị luồng val(f*)

là lớn nhất. Luồng như vậy sẽ được gọi là luồng cực đại trong mạng.

Bài toán luồng cực đại trong mạng là một trong những bài toán tối ưu trênđồ thị tìm được những ứng dụng rộng rãi trong thực tế cũng như những ứng

dụng thú vị trong lý thuyết tổ hợp. Bài toán được đề xuất và gắn liền với tên tuổi

của hai nhà toán học Mỹ là Ford và Fulkerson. Trong nội dung bài viết này tôi

muốn trình bày thuật toán của hai ông (tham khảo trong cuốn sách CẨM NANG

THUẬT TOÁN của tác giả ROBERT SEDGEWICK).

Định nghĩa 1. Mạng là một đồ thị có hướng G = (V,E), trong đó có duynhất một đỉnh s không có cung đi vào gọi là điểm phát và có duy nhất một đỉnh t

không có cung đi ra gọi là điểm thu và mỗi cung e = (v,w) thuộc E được gán với

Page 47: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

48

một số không âm c(e) = c(v,w) gọi là khả năng thông qua của cung e (nếu không

có cung (v,w) thì khả năng thông qua c(v,w) được gán bằng 0).

Định nghĩa 2. Một luồng f trong mạng G = (V,E) là ánh xạ f : E -> R+ gán

cho mỗi cung e = (v,w) thuộc E một số thực không âm f(e) = f(v,w), gọi là luồng

trên cung e, thoả mãn các điều kiện sau:

Luồng trên mỗi cung e thuộc E không vượt quá khả năng thông qua của nó:

0 ≤ f(e) ≤ c(e).

Điều kiện cân bằng luồng trên mỗi đỉnh của mạng là tổng luồng trên mỗi

cung đi vào đỉnh v bằng tổng luồng trên các cung đi ra khỏi đỉnh v, nếu v ≠ s và

v ≠ t thì:

Divf(v) = Σf(w,v) - Σ f(v,w) = 0

w thuộc G - (v) w thuộc G + (v)

trong đó G - (v) là tập các đỉnh của mạng mà từ đó có cung đến v, và G + (v)

là tập các đỉnh của mạng mà từ v có cung đến nó.

G - (v) = { w thuộc V : (w,v) thuộc E};

G + (v) = { w thuộc V : (v,w) thuộc E};

3) Giá trị của luồng f là số:

val( f ) = Σ f(s,w) = Σ f(w,t)

w thuộc G + (v) w thuộc G - (v)

2. Cơ sở thuật toán tìm luồng cực đại trong mạng

* Ví dụ các thông số của bài toán:

+ Số đỉnh là n = 6

+ Đỉnh phát s= 1

+ Đỉnh thu t = 6

+ Khả năng thông qua của các cung

được cho cụ thể trên hình.

* Ý tưởng thô sơ

Sử dụng thuật toán thăm để tìm đường đi từ đỉnh phát đến đỉnh thu.

1

6 6

2 4

6

3 1

3

3 5

6 6

6

Page 48: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

49

Điều kiện : từ đỉnh i đến được j nếu f(i, j)< c(i, j).

Cập nhật giá trị theo đường đi tìm được.

Tìm tiếp con đường khác nếu có thể.

Theo cách đó ta tìm được các đường và tăng được lượng vận chuyển:

+ Đường đi 1 -> 2 -> 3 -> 6 vận chuyển được 3

+ Đường đi 1 -> 2 -> 5 -> 6 vận chuyển được 3

+ Đường đi 1 -> 4 -> 3 -> 6 vận chuyển được 3

+ Đường đi 1 -> 4 -> 5 -> 6 vận chuyển được 1

tổng vận chuyển được 10

Nếu ta đánh lại số hiệu đỉnh 3 thay đổi cho 5, ta tìm được đường đi sau:

+ Đường đi 1 -> 2 -> 3 -> 6 vận chuyển được 6

+ Đường đi 1 -> 4 -> 5 -> 6 vận chuyển được 6

tổng vận chuyển được 12

Ta thấy trường hợp sau vừa nhanh vừa tốt hơn. Phải chăng ta tìm được khảnăng vận chuyển tốt phụ thuộc vào cách đánh số hiệu đỉnh? Nếu đúng như thếthì ta không thể tìm cách tốt cho bài toán có nhiều đỉnh hơn (khi đó ta phải thửvới các các gán nhãn đỉnh --- quá lớn).

Ta quay trở lại bài toán ban đầu: tại đầu các chỗ nối có các công tắc điều

khiển hướng đi của dầu. Trong khi đã tìm được 4 đường đi trên, vận chuyển trên

cung (1,2) là 6 đã đầy, trên cung (2, 3) là 3 đầy, trên cung (2, 5) là 3 còn dư 3.Ta thử điều chỉnh công tắc chuyển hướng đi của dầu theo cung (2, 5) là 5 (không

là 6 vì nếu không đến đỉnh 5 lại ứ đọng), còn cung (2, 3) là 1. Ta sẽ tìm tiếp

đường đi và được đường đi 1 -> 4 -> 3 -> 6, vận chuyển thêm được 2 và kết quảlà tăng lên thêm 2 đơn vị nữa.

- Vận chuyển thực theo các đường đi là:

+ Đường đi 1 -> 2 -> 3 -> 6 vận chuyển được 1

+ Đường đi 1 -> 2 -> 5 -> 6 vận chuyển được 5

+ Đường đi 1 -> 4 -> 3 -> 6 vận chuyển được 5

Page 49: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

50

+ Đường đi 1 -> 4 -> 5 -> 6 vận chuyển được 1

tổng vận chuyển được 12

Vấn đề là ta cần khéo léo khi chỉnh công tắc chỉnh hướng dầu ở trên sao

cho khéo. Ta nhìn nhận vấn đề này trên khía cạnh tìm đường đi.

+ Đường đi 1 -> 2 -> 3 -> 6 vận chuyển được 3

+ Đường đi 1 -> 2 -> 5 -> 6 vận chuyển được 3

+ Đường đi 1 -> 4 -> 3 -> 6 vận chuyển được 3

+ Đường đi 1 -> 4 -> 5 -> 6 vận chuyển được 1

- Vấn đề chỉnh công tắc, hình thành đường đi

+ Đường đi 1 -> 2 -> 5 -> 6 chỉnh sang 2

+ Đường đi 1 -> 2 -> 3 -> 6 bớt 2, cung (3, 6) còn 4

+ Thêm đường đi 1 -> 4 -> 3 -> 6 thêm 2

(Hình thành đường đi 1 -> 4 -> 3 -> 2 -> 5 -> 6 vận chuyển được 2)

Ta thấy vận chuyển từ 2 -> 3 là 3; vận chuyển ngược từ 3 -> 2 là 2. Tổng

hợp vận chuyển trên cung (2, 3) là 1.

Vậy vấn đề hình thành cách làm tổng quát ta cần tập trung giải quyết theo

hướng này.

* Tìm đường tăng luồng

+ Vấn đề bây giờ cần tìm đường tăng khả năng vận chuyển của cả mạng

chứ không đơn thuần là tìm đường đi thuần túy như ban đầu. (không cần thay

đổi cách gán số hiệu đỉnh)

Tìm đường tăng luồng chứ không phải là tìm đường đi tìm được

đường mới mà làm tăng khả năng vận chuyển của mạng là được, cập nhật.

Ta chỉnh sửa phần tìm đường đi: để đi được từ đỉnh i đến đỉnh j ta sửdụng điều kiện ban đầu: f(i, j)<c(i, j)

kết hợp thêm điều kiện f(j, i )>0

Đây là điểm mấu chốt cần dẫn dắt và chỉ rõ cho người sử dụng, hiểu được

thuật toán chứ không áp đặt theo thuật toán mẫu sẵn có.

Page 50: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

51

3. Mô tả thuật toán Ford-Fulkerson trong thủ tục sau đây:

Procedure Max_Flow;

(*Thuật toán Ford-Fulkerson *)

Begin

(* khởi tạo bắt đầu từ luồng với giá trị 0 *)

for u thuộc V do

for v thuộc V do f(u,v):=0;

Stop:= false;

While not Stop do

If {tìm được đường tăng luồng P} then

{tăng luồng dọc theo P}

else stop:=true;

End;

BIỂU DIỄN ĐỒ THỊ VÀ DUYỆT ĐỒ THỊ

THPT Chuyên Lê Hồng Phong, Nam Định

Biểu diễn đồ thị

Để lưu trữ đồ thị và thực hiện các thuật toán khác nhau, ta cần phải biểu

diễn đồ thị ở trên máy tính đồng thời sử dụng những cấu trúc dữ liệu thích hợp

để môt tả đồ thị. Việc chọn cấu trúc dữ liệu nào để biểu diễn đồ thị có tác động

rất lớn đến hiệu quả của thuật toán. Ta có 3 cách cơ bản sau đây dùng để biểu

diễn đồ thị:

Biểu diễn đồ thị bằng ma trận kề

Xét đơn đồ thị vô hướng G=<V,E>, với tập đỉnh V={1, 2, 3, …,n}, tập

cạnh E={e1,e2,…,en}. Ma trận kề của đồ thị G là ma trận có các phần tử bằng 0

hoặc bằng 1 theo qui định như sau:

Page 51: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

52

A={aij: aij=1 nếu (i,j) E, aij=0 nếu (i,j) E; i, j=1, 2, …,n}

Ví dụ: biểu diễn đồ thị dưới đây bằng ma trận kề:

Đỉnh

1 2 3 4 5 6

1 0 1 1 0 0 0

2 1 0 1 1 0 0

3 1 1 0 0 1 0

4 0 1 0 0 1 1

5 0 0 1 1 0 1

6 0 0 0 1 1 0

Một số tính chất ma trận kề

Ma trận kề là ma trận đối xứng

Tổng các phần tử dòng i hoặc cột j chính là bậc của đỉnh i hoặc cột j

Ma trận kề của đơn đồ thị có hướng được biểu diễn tương tự, ma trận kềcủa đồ thị có hướng là không đối xứng.

Nếu đồ thị mà mỗi cạnh e=(u,v) được biểu diễn bởi một số c(e)=c(u,v) gọi

là trọng số cạnh e. Đồ thị như vậy gọi là đồ thị có trọng số. Ma trận kề biểu diễn

đồ thị được thay bằng ma trận trọng số.

A={aij: aij=c(i,j) nếu (i,j) E, aij= nếu (i,j) E; i, j=1, 2, …,n}

Trong đó nhận giá trị 0; ∞; -∞ tùy vào từng tình huống.

Ví dụ: biểu diễn đồ thị dưới đây bằng ma trận trọng số

Đỉnh

1 2 3 4 5 6

1 0 7 8 0 0 0

1

2

3

4

5

6

1

2

3

4

5

6

3

64

Hình 1

Page 52: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

53

Ưu điểm ma trận kề dễ dàng xác định 2 đỉnh của đồ thị có kề nhau haykhông, nhược điểm ma trận kề bất kể đồ thị như thế nào đều mất n x n đơn vị bộnhớ để biểu diễn.

Biểu diễn đồ thị bằng danh sách cạnh (cung)

Trong trường hợp đồ thị thưa (có số cạnh m<6n), người ta thường biểu diễn

đồ thị dưới dạng danh sách cạnh (cung). Mỗi cạnh e(u,v) được biểu diễn tươngứng với 2 biến dau[e], cuoi[e]

Ví dụ: đơn đồ thị vô hướng cho trong hình 1, hình 2 biểu diễn bằng danh

sách cạnh như sau:

dau cuoi dau cuoi trongso

1 2 1 2 7

1 3 1 3 8

2 3 2 3 4

2 4 2 4 3

3 5 3 5 9

4 5 4 5 6

4 6 4 6 1

5 6 5 6 7

Hình 1 Hình 2

2 7 0 4 3 0 0

3 8 4 0 0 9 0

4 0 3 0 0 6 1

5 0 0 9 6 0 7

6 0 0 0 1 7 0

7

8

9

1

7

Hình 2

Page 53: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

54

Để biểu diễn đồ thị danh sách cạnh cần 2x m đơn vị bộ nhớ, nhược điểm

cách biểu diễn này là để biết có cạnh i, j hay không cần m phép so sánh duyệt

qua m cạnh của đồ thị.

Biểu diễn đồ thị bằng danh sách kề

Trong rất nhiều ứng dụng biểu diễn đồ thị bằng danh sách kề hay được sửdụng. Trong cách biểu diễn này, với mỗi đỉnh u ta lưu trữ danh sách các đỉnh kềvới nó mà kí hiệu là Ke(u)

Ke(u)= {vV: (u,v)E}

Ví dụ: danh sách kề của đồ thị vô hướng trong Hình 1 được biểu diễn nhưsau:

Ke(i)

1 2 3

2 1 3 4

3 1 2 5

4 2 5 6

5 3 4 6

6 4 5

Duyệt đồ thị

Có hai thuật toán duyệt đồ thị được sử dụng rất nhiều trong các bài toán vềđồ thị, thuật toán duyệt đồ thị theo chiều sâu (DFS-Depth First Search) và duyệt

đồ thị theo chiều rộng (BFS-Breath First Search)

Duyệt đồ thị theo chiều sâu (DFS):

Tư tưởng: Bắt đầu từ một đỉnh bất kì đồ thị gọi là đỉnh u ta thăm đỉnh đó,chọn đỉnh v bất kì kề với đỉnh u chưa được thăm, lấy nó làm đỉnh thăm tiếp

theo. Cách duyệt tiếp tục thực hiện tương tự như đỉnh u với đỉnh bắt đầu là v.

Thuật toán: mô tả bằng thủ tục đệ quy sau:

Procedure DFS(u);

Begin

Page 54: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

55

Tham(u);

Chuaxet[u]=false;

For v ke(u) do

If chuaxet[v] then DFS(v);

End;

{dùng mảng Chuaxet đánh dấu đỉnh đã thăm, ban đầu gán True}

Ví dụ: thứ tự các đỉnh duyệt theo DFS của đồ thị Hình 1 là: 1; 2; 3; 5; 4; 6

Duyệt đồ thị theo chiều rộng:

Tư tưởng: Sử dụng thêm cấu trúc dữ liệu hàng đợi (Queue). Đỉnh được

nạp đầu tiên vào hàng đợi là u, tiếp theo là các đỉnh kề với u được nạp vào hàng

đợi. Quá trình duyệt được bắt đầu từ các đỉnh có mặt trong hàng đợi.

Thuật toán:

Procedure BFS(u);

Begin

Q=; {Q: là hàng đợi}

Add(Q,p);

Chuaxet[p]=false;

While Q <> do

Begin

Remov(Q,u);

Tham(u);

For v Ke(u) do

If chuaxet[v] then

Begin

Add(Q,v);

Chuaxet[v]=false;

Page 55: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

56

End;

End;

End;

{dùng mảng Chuaxet đánh dấu đỉnh đã thăm, ban đầu gán True}

Ví dụ: thứ tự các đỉnh duyệt theo BFS của đồ thị Hình 1 là: 1; 2; 3; 4; 5; 6

Một số bài tập

Hãy vẽ các đồ thị vô hướng được biểu diễn bởi ma trận liền kề sau:

a)1 2 3

2 0 4

3 4 0

, b)

1 2 0 1

2 0 3 0

0 3 1 1

1 0 1 0

, c)

0 1 3 0 4

1 2 1 3 0

3 1 1 0 1

0 3 0 0 2

4 0 1 2 3

.

2. Nêu ý nghĩa của tổng các phần tử trên một hàng (t.ư. cột) của một ma

trận liền kề đối với một đồ thị vô hướng ? Đối với đồ thị có hướng ?

Bài 3: Network

Trong một mạng gồm N máy tính đánh số từ 1 đến N. Sơ đồ nối mạng

được cho bởi hệ thống gồm M kênh nối trực tiếp giữa M cặp máy tính trong

mạng. Biết chi phí xây dựng mỗi kênh nối trực tiếp từ máy i đến máy j là aij

(0<=aij<=30000)

Yêu cầu: Kiểm tra hệ thống đã xây dựng có đảm bảo sự truyền tin của các

máy bất kỳ chưa? Nếu chưa, hãy chọn một số kênh nối trực tiếp cần xây dựng

thêm sao cho:

Các kênh sẽ được xây dựng thêm cùng với các kênh đã có bảo đảm sựtruyền tin giữa các máy tính bất kỳ trong mạng.

Tổng kinh phí xây dựng thêm các kênh nối trực tiếp là ít nhất.

Dữ liệu vào: từ file NETWORK.INP

+ Dòng đầu tiên ghi 2 số N và M cách nhau bởi dấu cách (N<= 100).

+ M dòng sau, mỗi dòng ghi 2 số là số hiệu 2 máy có kênh nối trực tiếp.

+ N dòng tiếp theo, dòng thứ i ghi N số nguyên dương ai1, ai2,..,ain

Page 56: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

57

Dữ liệu ra: file NETWORK.OUT

Ghi một số nguyên C là tổng kinh phí xây dựng thêm.

Page 57: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

58

Ví dụ:

NETWORK.INP NETWORK.OUT

5 4

1 2

2 3

3 1

4 5

0 1 1 1 1

1 0 1 1 1

1 1 0 1 1

1 1 1 0 1

1 1 1 1 0

1

Page 58: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

59

THAM LUẬN VỀ BỒI DƯỠNG HỌC SINH GIỎI MÔN: TIN HỌC TẠITHỪA THIÊN HUẾ.

Trường THPT Chuyên Quốc Học Huế

1. Việc phát triển và bồi dưỡng học sinh

Ngày nay, khi nói đến sức mạnh của một quốc gia, mọi người đều thừa

nhận rằng, nguồn nhân lực, nhân tài là yếu tố quan trọng và quyết định nhất.

Trong đó, nhân tài là bộ phận tinh tuý, có giá trị nhất của nguồn nhân lực quốc

gia. Vì vậy, việc nghiên cứu và phát triển, đào tạo, bồi dưỡng, thu hút và sửdụng nhân tài đã trở thành quốc sách của nhiều quốc gia.

Như văn kiện của Đảng cộng sản Việt Nam – Văn kiện Hội nghị lần thứsáu Ban Chấp hành TW khóa IX có ghi: “Hiền tài là nguyên khí quốc gia.

Nguyên khí thịnh thì thế nước hùng mạnh, rồi lên cao, nguyên khí suy thì thếnước yếu, rồi thấp xuống”. Điều đó không chỉ thể hiện giá trị của nhân tài trong

lịch sử của Việt Nam mà ngày nay, trong thời đại tri thức nó vẫn còn nguyên giá

trị đối với mọi quốc gia trên thế giới. Chính vì vậy, Đảng ta đã đề ra yêu cầu:

“Hoàn thiện hệ thống cơ chế, chính sách phát hiện, đào tạo, bồi dưỡng, sử dụng

nhân tài đáp ứng yêu cầu công nghiệp hóa, hiện đại hóa”. Điều này chính là kim

chỉ nam cho các trường chuyên nhắm đến đích của công việc được giao.

Là ngôi trường lưu dấu nhiều kỷ niệm thời học sinh của Chủ tịch Hồ Chí

Minh, trường THPT Chuyên Quốc Học Huế cũng là một trong những ngôi

trường lịch sử - nơi đã đào tạo và nuôi dưỡng bao thế hệ nhân tài cho đất nước.

Ngày nay, Quốc Học Huế vẫn luôn là lá cờ đầu của ngành giáo dục Thừa Thiên

Huế nói riêng và cả nước nói chung với tỉ lệ học sinh giỏi đạt trên 70% hàng

năm, trong đó rất nhiều học sinh đạt giải cao trong các kỳ thi Quốc gia và Quốc

tế. Trên 90% học sinh Quốc Học thi đỗ đại học, trong đó có rất nhiều thủ khoa, á

khoa, nhiều học sinh đạt được các suất học bổng du học. Đội ngũ cán bộ quản lý

và giáo viên giàu nhiệt huyết và kinh nghiệm, không ngừng vươn lên trong cáchoạt động chuyên môn. Nhiều thầy, cô giáo là Nhà giáo ưu tú, giáo viên dạy

giỏi, chiến sĩ thi đua các cấp.

Page 59: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

60

Dựa trên các mục tiêu của chương trình dành cho học sinh giỏi và học

sinh tài năng nhìn chung nhiều Quốc gia đều khá giống nhau. Có thể khái quát

thành một số nhiệm vụ chính sau đây:

- Phát triển phương pháp suy nghĩ ở trình độ cao phù hợp với khả năng trítuệ của trẻ.

- Bồi dưỡng sự lao động, làm việc sáng tạo.

- Phát triển các kĩ năng, phương pháp và thái độ tự học suốt đời.

- Nâng cao ý thức và khát vọng của trẻ về sự tự chịu trách nhiệm.

- Khuyến khích sự phát triển về lương tâm và ý thức trách nhiệm trong

đóng góp xã hội.

- Phát triển phẩm chất lãnh đạo.

Tuy vậy, trong công tác bồi dưỡng học sinh giỏi hiện nay vẫn gặp phải

những hạn chế về kết quả và không ổn định. Điều đó xuất phát từ những nguyên

nhân chủ yếu như: nội dung bồi dưỡng quá chuyên sâu mà giáo viên dạy chuyên

đều phải tự soạn, tự nghiên cứu và tự sưu tầm tài liệu. Nhiều học sinh không yên

tâm khi chọn môn Tin học theo học lớp chuyên vì phải mất nhiều thời gian, ảnh

hưởng đến sức khỏe và kết quả học tập chung đặc biệt là không có liên quan đến

môn thi đại học. Tài liệu dành cho bộ môn còn quá ít ỏi. Tuy nhiên nhiều học

sinh vẫn có ý chí tiến thủ, say mê bộ môn, cần cù chăm chỉ và quyết tâm học tập

để đạt được kết quả như ý muốn.

Hằng năm khi tuyển sinh vào lớp 10, Sở GD-ĐT có định hướng để chọn

khoảng 30 em (1 lớp) vào lớp chuyên của trường. Thi đầu vào ngoài 3 môn thi

bắt buộc chung, thì môn chuyên được chọn là môn Toán (nặng phần logic). Khi

tiến hành việc chọn môn thi đầu vào môn Toán thì đã có nhiều tranh cải. Một

thời gian thực hiện thí điểm chọn môn thi đầu vào là lập trình thì hầu hết học

sinh vào học không được tốt nên phải quay lại cách tuyển sinh như trước đó.

Về đội ngũ giáo viên, có thể nói đây là một đội ngũ có yếu tố quyết định

quan trọng về kết quả bồi dưỡng học sinh giỏi. Điều này dễ nhận thấy ở các bộmôn thể dục thể thao, ở đâu có huấn luyện viên giỏi thì ở đó thường có những

học sinh giỏi. Ngành Giáo dục và Đào tạo cũng không nằm ngoài quy luật đó.Do đó, lãnh đạo nhà trường bằng mọi cách hỗ trợ nhân lực, vật lực cho giáo viên

Page 60: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

61

của trường tham gia công tác bồi dưỡng học sinh giỏi. Tạo điều kiện cho giáo

viên đi bồi dưỡng chuyên môn nghiệp vụ do Bộ, Sở và các trường Đại học tổchức.

Ngoài ra, để hỗ trợ cho công tác dạy-học học sinh giỏi có hiệu quả, các bộphận gián tiếp như: chi bộ, ban giám hiệu, công đoàn, Đoàn thanh niên, giáoviên chủ nhiệm… cũng rất quan tâm và có những biện pháp hỗ trợ đúng mức

như: tạo điều kiện cho giáo viên và học sinh tham gia bồi dưỡng. Ví dụ: bớt tiết

nghĩa vụ, bớt công tác kiêm nghiệm, bồi dưỡng thỏa đáng cho giáo viên, có chếđộ học bổng hàng năm cho học sinh; tuyên dương khen thưởng kịp thời đối với

các giáo viên và học sinh đạt thành tích như đi tham quan nghỉ mát, ưu tiên nhận

học bổng của các tổ chức…; quan tâm theo dõi và đáp ứng các nghiên cứu chính

đáng của giáo viên và học sinh về phòng học, mua tài liệu, photo bài học, bài

tập…; phải xem đây là một nhiệm vụ chiến lược cần đầu tư lâu dài.

Hằng năm, Sở giáo dục và đào tạo Thừa Thiên Huế tổ chức kỳ thi Tỉnh đểchọn ra những học sinh giỏi thực sự vào đội tuyển Quốc gia. Sau khi thành lập

đội tuyển, Sở sẽ chọn ra những giáo viên có đủ năng lực để bồi dưỡng các em.

Sau khi có kết quả kỳ thi các cấp, UBND tỉnh có các chế độ ưu đãi cho

giáo viên và học sinh rất thích đáng nhằm động viên phong trào.

2. Những chương trình bồi dưỡng thêm

Với môn Tin Học, Nhà trường luôn tạo điều kiện tốt nhất để giáo viên

giảng dạy. Các tài liệu để giáo viên giảng dạy luôn được Nhà trường chủ trọng

và đầu tư.

Ngoài các chuyên đề tất yếu của dạy học sinh trong chương trình chuyên,

các chương trình bồi dưỡng thêm là: Vấn đề hình học, xác suất, logic mờ, trí tuệnhân tạo,... Đồng thời luôn yêu cầu các em luôn thành thục những vấn đề sau:

1. Yêu cầu học sinh phải nắm vững ngôn ngữ lập trình Free Pascal.

2. Hướng dẫn cho học sinh nắm bắt các thuật toán để giải các dạng toán

thường gặp trong các đề thi Tin học trên toàn quốc, Quốc tế.

3. Thường xuyên bồi dưỡng, hướng dẫn cho học sinh cách chạy thửchương trình cách yêu cầu học sinh phân tích, nêu kết quả từng câu lệnh.

Page 61: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

62

4. Hướng dẫn học sinh giải một bài toán bằng nhiều thuật toán, sau đógiáo viên nêu ưu khuyết điểm từng thuật toán; so sánh và chọn thuật toán tối ưunhất.

5. Nên đưa ra các bài tập và định thời gian để học sinh tự làm. Giáo viên

chỉ hướng dẫn sơ qua về cách giải (thuật toán), sau đó yêu cầu học sinh tự xây

dựng thuật toán và lập trình giải bài toán. Lập ra bộ test cho các bài giải mở rộng

dần từ dữ liệu nhỏ đến dữ liệu lớn hơn theo yêu cầu của đề ra.

3. Đề xuất

Để nâng cao chất lượng bồi dưỡng học sinh chuyên, Nhà trường có một

số đề xuất sau:

- Hằng năm, Bộ Giáo dục và đào tạo nên tăng cường nhiều hơn nữa các

đợt tập huấn chuyên cho giáo viên. Đợt tập huấn có thể chia làm nhiều đợt để tất

cả các giáo viên dạy chuyên có thể tham gia.

- Mỗi đợt tập huấn nên tăng cường thời gian bồi dưỡng chuyên sâu của bộmôn. Các chuyên viên tập huấn nên giới thiệu cho giáo viên các chuyên đề mới

cũng như cung cấp các tài liệu mới cho giáo viên tham khảo.

- Có hướng dẫn cụ thể trong việc liên kết giữa các trường chuyên và các

trường Đại học. Những chuyên đề nào học sinh đã được học nghiêm túc thì

được cấp chứng chỉ để lên lớp trên được miễn học học phần đó ở các cấp học

trên.

- Tổ chức bồi dưỡng giáo viên các lớp dạy môn chuyên bằng tiếng Anh.

- Tiếp tục duy trì các chế độ ưu tiên cho học sinh giỏi như : thi đúngchuyên ngành (thay môn Hóa bằng lập trình) khi thi vào đại học, tuyển thẳng

vào đại học khi đạt giải quốc gia.

Page 62: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

63

LOANG TRONG LƯỚI Ô VUÔNG

Trần Xuân Bình, Chuyên viên Tin học, Sở Giáo dục và Đào tạo Hà Tĩnh

I) THUẬT TOÁN LOANG:

Thuật toán Loang thực chất là thuật toán tìm kiếm theo chiều rộng trên đồ thị(Breadth First Search). Để hiểu rõ bản chất của thuật toán này, ta hãy xem xét

một cách đưa ra thứ tự duyệt các đỉnh của một đồ thị vô hướng G = (V,E), N

đỉnh và M cạnh (số hiệu của các đỉnh là 1,2,…,N) như sau: Thứ tự duyệt có thểbắt đầu từ một đỉnh v nào đó. Tư tưởng của thuật toán là sử dụng cấu trúc dữliệu kiểu hàng đợi (QUEUE - vào trước ra trước). Phần tử được nạp vào đầu tiên

của QUEUE là đỉnh v. Sau đó cứ mỗi đỉnh p lấy ra khỏi QUEUE là ta thăm đỉnh

đó đồng thời nạp vào QUEUE những đỉnh chung cạnh với p (chỉ nạp vào những

đỉnh chưa xét đến). Quá trình trên được lặp đi lặp lại cho đến khi nào QUEUE

rỗng thì dừng.

Chương trình mô phỏng:

Ban đầu tất cả các đỉnh i (i = 1..n) đều đặt cờ chuaxet[i] = True. Nếu đỉnh nào

xét rồi ta đặt cờ của đỉnh đó sang trạng thái False.

Procedure BFS(v); Tìm kiếm theo chiều rộng bắt đầu từ đỉnh v

Begin

QUEUE = ; {Khởi tạo QUEUE ban đầu là rỗng}

QUEUE <= v; {Nạp đỉnh v vào QUEUE}

Chuaxet[v]:=False;{Đỉnh v nạp vào QUEUE là đã xét rồi => cờ của v là

False}

While QUEUE ≠ do

Begin

P <= QUEUE; {Lấy p từ QUEUE}

Thăm đỉnh p;

Page 63: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

64

For u € Ke(p) do {Những đỉnh u chung cạnh với đỉnh p}

If Chuaxet(u) then {Nếu đỉnh u chưa xét đến}

Begin

QUEUE <= u; {Nạp u vào QUEUE}

Chuaxet[u]:=False; {Đỉnh u đã xét rồi =>cờ của u là False }

End;

End;

End;

BEGIN {Chương trình chính}

For v € V do Chuaxet[v]:=True;

For v € V do

If Chuaxet[v] then BFS(v);

END.

Người ta thường dùng dữ liệu kiểu mảng để biểu diễn cấu trúc dữ liệu kiểu hàng

đợi QUEUE và sử dụng 2 biến Dau và Cuoi để điều khiển việc nạp vào và lấy

phần tử ra (biến Dau điều khiển thao tác lấy ra, biến Cuoi điều khiển thao tác

nạp vào).

Với bài toán trên ta sử dụng mảng 1 chiều Q: Array[1..N] of Byte để biểu diễn

QUEUE. Khi đó thao tác nạp vào và lấy ra được thực hiện như sau:

FillChar(Q,SizeOf(Q),0); {Khởi tạo tất cả các phần tử của Q có giá trị 0}

Dau:=1;

Cuoi:=1;

Q[cuoi]:=v; {Ban đầu nạp đỉnh v vào Q}

Để nạp thêm đỉnh u nào đó vào Q ta thực hiện:

Cuoi:=Cuoi+1; {Hoặc dùng lệnh Inc(Cuoi)}

Q[Cuoi]:=u;

Để lấy một đỉnh p nào đó ra khỏi Q ta thực hiện:

Page 64: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

65

P:=Q[Dau];

Inc(Dau);

Lưu ý: Ta nói lấy đỉnh p ra khỏi hàng đợi Q là lấy ra theo cơ chế điều khiển (vì

biến Dau đã tăng lên một đơn vị qua lệnh Inc(Dau)); về mặt vật lý thì p vẫn

đang nằm trong mảng Q. Như vậy ta phải hiểu rằng các phần tử trong cấu trúc

hàng đợi Q là các phần tử Q[Dau],..,Q[Cuoi].

Chương trình đầy đủ:

Program Thamdinhdothi;

Uses Crt;

Const

Nmax=253;

fi='TKR_DT.INP';

Var

f:Text;

s:Char;

A:Array[1..Nmax,1..Nmax] of 0..1;{Nếu có cạnh giữa đỉnh i và đỉnh j thì

A[i,j]=1, ngược lại A[i,j]=0 }

Chuaxet:Array[1..Nmax] of Boolean;{Cờ của các đỉnh, có trạng thái True

nếu chưa xét, ngược lại False}

Q:Array[1..Nmax] of Byte;{Biểu diễn hàng đợi QUEUE}

N,i,dem,dau,cuoi:Byte;

Procedure Doctep;

Begin

Assign(f,fi);

Reset(f);

Page 65: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

66

Readln(f,N); {N:Số đỉnh của đồ thị}

For i:=1 to N-1 do

Begin

dem:=0;

While not eoln(f) do

Begin

Read(f,s);

dem:=dem+1;

If s='1' then

Begin

A[i,dem+i]:=1;

A[dem+i,i]:=1;

End;

If s='0' then

Begin

A[i,dem+i]:=0;

A[dem+i,i]:=0;

End;

End;

Readln(f);

End;

Close(f);

End;

Procedure BFS(v:Integer);{Tìm kiếm theo chiều rộng bắt đầu từ đỉnh v}

Var

p,u:Byte;

Page 66: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

67

Begin

FillChar(Q,Sizeof(Q),0); {Khởi tạo tất cả các phần tử của mảng Q đều bằng

0}

dau:=1;

cuoi:=1;

Q[cuoi]:=v; {Nạp v vao Q}

Chuaxet[v]:=False;

While dau<=cuoi do {dau > cuối là Q rỗng }

Begin

p:=Q[dau];

dau:=dau+1; {Lấy đỉnh p ra khỏi Q }

If (dau-1) mod 14 = 0 then Writeln(p:4) {In ra số hiệu đỉnh p - thao tác

thăm đỉnh p}

Else Write(p:4); {trên màn hình xuất hiện mỗi

dòng không quá 14 số}

For u:=1 to N do

If (A[p,u]=1) and (Chuaxet[u]) then

Begin

cuoi:=cuoi+1;

Q[cuoi]:=u;

Chuaxet[u]:=False;

End;

End;

End;

BEGIN

Clrscr;

FillChar(A,Sizeof(A),0); {Khởi tạo tất cả các phần tử của mảng A đều bằng 0}

Page 67: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

68

Doctep;

FillChar(Chuaxet,Sizeof(Chuaxet),True); {Khởi tạo cờ của tất cả các đỉnh đều

ở trạng thái True - Trạng thái chưa xét}

Writeln('Thu tu tham cac dinh cua do thi khi tim kiem theo chieu rong la:');

For i:=1 to N do

If Chuaxet[i] then BFS(i);

Writeln;

Readln;

END.

Chương trình trên thực hiện với dữ liệu vào là tệp TKR_DT.INP có cấu trúc:

- Dòng đầu tiên, được gọi là dòng 0: ghi các số nguyên dương N, x cáchnhau ít nhất là một ký tự trống (N: Số đỉnh của đồ thị; x: Đỉnh xuất phát);

- Trong các dòng tiếp theo: Dòng thứ i (i = 1..N-1) ghi N-i số 0 và 1 liên

tiếp nhau cho biết giữa đỉnh i và đỉnh j có cạnh nối với nhau hay không (j = i +

1..N). Nếu số ghi ở vị trí j-i tính từ trái sang phải trên dòng thứ i có giá trị 1 thì

có cạnh nối giữa đỉnh i và đỉnh j, nếu là giá trị 0 thì không có cạnh nối.

Ví dụ với tệp TKR_DT.INP sau đây:

13 1

101000000010

01000000000

0001000000

011000000

10110000

1000001

000000

10000

0000

Page 68: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

69

110

10

0

Với tệp dữ liệu vào như trên ta phải hiểu như sau:

+ Ở dòng 0: N=13, x=1;

+ Ở dòng 1: 101000000010

- giữa đỉnh 1 với đỉnh 2 có cạnh nối với nhau

- giữa đỉnh 1 với đỉnh 3 không có cạnh nối với nhau

- giữa đỉnh 1 với đỉnh 4 có cạnh nối với nhau

- giữa đỉnh 1 với đỉnh 5 không có cạnh nối với nhau

....

- giữa đỉnh 1 với đỉnh 11 không có cạnh nối với nhau

- giữa đỉnh 1 với đỉnh 12 có cạnh nối với nhau

- giữa đỉnh 1 với đỉnh 13 không có cạnh nối với nhau

+ Ở dòng 2: 01000000000

- giữa đỉnh 2 với đỉnh 3 không có cạnh nối với nhau

- giữa đỉnh 2 với đỉnh 4 có cạnh nối với nhau

....

+ Ở dòng 11: 10

- giữa đỉnh 11 với đỉnh 12 có cạnh nối với nhau

- giữa đỉnh 11 với đỉnh 13 không có cạnh nối với nhau

+ Ở dòng 12: 0

- giữa đỉnh 12 với đỉnh 13 không có cạnh nối với nhau

Quan hệ giữa các đỉnh được mô tả qua đồ thị sau:

2 3 5

Page 69: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

70

7 8

4

1 6 9

12 13

10 11

Thứ tự các đỉnh được nạp vào hàng đợi Q và lấy ra tuần tự như sau:

Các phần tử

nạp vào Q

Các phần

tử có trạng

thái cờ là

False

Các phần tử

trong Q

Phần tửlấy ra

khỏi Q

1 1 1

2,4,12 (Khi lấy 1 ra) 2,4,12 2,4,12 1

Không nạp phần tửnào khi lấy 2 ra khỏi

Q

4,12 2

6,7 6,7 12,6,7 4

10,11 10,11 6,7,10,11 12

5,13 5,13 7,10,11,5,13 6

3 3 10,11,5,13,3 7

Không nạp phần tửnào khi lấy 10 ra khỏi

11,5,13,3 10

Page 70: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

71

Q

Không nạp phần tửnào khi lấy 11 ra khỏi

Q

5,13,3 11

8,9 8,9 13,3,8,9 5

Không nạp phần tửnào khi lấy 13 ra khỏi

Q

3,8,9 13

Không nạp phần tửnào khi lấy 3 ra khỏi

Q

8,9 3

Không nạp phần tửnào khi lấy 8 ra khỏi

Q

9 8

Không nạp phần tửnào khi lấy 9 ra khỏi

Q

Rỗng 9

Các phần tử tuần tự được lấy ra khỏi hàng đợi Q chính là các đỉnh được duyệt:

1, 2, 4, 12, 6, 7, 10, 11, 5, 13, 3, 8, 9

Qua đó cho thấy từ một đỉnh ta thăm đến các đỉnh khác liên quan đến nó theo

chiều rộng. Chính vì vậy thuật toán tìm kiếm theo chiều rộng được gọi là thuật

toán Loang.

II) LOANG TRONG LƯỚI Ô VUÔNG:

Page 71: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

72

Nhiều mô hình bài toán Loang được đưa ra trong các lưới ô vuông, khi đó việc

thể hiện tư tưởng của thuật toán như thế nào?

Để rèn luyện kỹ năng "loang" trong lưới ô vuông, tôi xin giới thiệu cách giải hai

bài toán sau đây:

Bài toán 1: Đường đi của Robot (Đề thi HSG lớp 12 năm học 2009 - 2010,

Tỉnh Hà Tĩnh)

Một bảng hình chữ nhật có kích thước MxN (M,N nguyên dương và không lớn

hơn 100) được chia thành các ô vuông đơn vị bằng các đường thẳng song song

với các cạnh. Một số ô vuông nào đó có thể đặt các vật cản. Từ một ô vuông,

Robot có thể đi đến một ô vuông kề cạnh với nó nếu ô vuông đó không có vật

cản. Hỏi rằng nếu Robot bắt đầu xuất phát từ một ô vuông không có vật cản

thuộc dòng K, cột L thì có thể đi đến được ô vuông không có vật cản thuộc dòng

H, cột O hay không? Nếu có thì hãy chỉ ra đường đi qua ít ô vuông nhất.

Dữ liệu vào là tệp văn bản BAI3.INP có cấu trúc:

- Dòng đầu tiên ghi các chữ số M, N, K, L, H, O. Các số ghi cách nhau ít

nhất một ký tự trống;

- M dòng tiếp theo, mỗi dòng ghi N số 1 hoặc 0 tuỳ thuộc vào ô vuông

tương ứng trong bảng hình chữ nhật nêu trên có vật cản hay không (ghi số 1 nếu

có vật cản); các số trên mỗi dòng ghi liên tiếp nhau.

Dữ liệu ra là tệp văn bản BAI3.OUT có cấu trúc:

Nếu Robot có thể đi được từ ô vuông thuộc dòng K, cột L đến ô vuông

thuộc dòng H, cột O thì:

- Dòng đầu tiên ghi ‘Co duong di ‘;

- Các dòng tiếp theo, mỗi dòng ghi 2 số là chỉ số dòng và chỉ số cột của các

ô vuông trong đường đi tìm được từ ô vuông thuộc dòng K, cột L đến ô vuông

thuộc dòng H, cột O mà qua ít ô vuông nhất. Hai số trên mỗi dòng ghi cách nhau

ít nhất một ký tự trống;

Page 72: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

73

- Ngược lại, nếu Robot không thể đi được từ ô vuông thuộc dòng K, cột L

đến ô vuông thuộc dòng H, cột O thì ghi ‘Khong co duong di’.

Ví dụ 1:

Tệp robot.inp:

4 7 3 4 2 6

1000000

0010100

0000000

1101000

Tệp robot.out:

Co duong di

3 4

3 5

3 6

2 6

Ví dụ 2:

Tệp robot.inp:

4 7 2 2 1 3

1010000

0010100

0100000

1101000

Tệp robot.out:

Khong co duong di

Phân tích:

Yêu cầu của bài toán thực chất là tìm đường đi từ ô [K,L] đến ô [H,O] sao cho

qua ít ô vuông nhất. Ta dễ thấy thuật toán để xử lý một cách hợp lý nhất là thuật

toán Loang. Ta bắt dầu “loang” từ ô [K,L], nếu “loang” đến được ô [H,O] thì có

đường đi, ngược lại không có đường đi.

Hàng đợi phục vụ “loang” được thể hiện bởi mảng 2 chiều

Q:Array[1..2,Mmax*Max] of Byte; hàng thứ 1 của Q để lưu thông tin chỉ sốhàng, hàng thứ 2 lưu thông tin của chỉ số cột của các ô khi nạp vào Q.

Page 73: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

74

Mảng A lưu thông tin tình trạng các ô - có vật cản hay không của bảng hình chữnhật chứa các ô vuông.

Mảng P dùng để đánh dấu những ô đã “loang” đến; đồng thời để phục vụ cho

việc truy xuất đường đi sau này nên khi ô [i,j] được “loang” đến thì P[i,j] được

gán giá trị là r (r là giá trị tương ứng với hướng mà ô trước đó “loang” đến,

hướng nào tương ứng với giá trị k bao nhiêu tuỳ theo quy định, ví dụ r = 1 - sang

phải, 2 - đi xuống, 3 - sang trái, 4 - đi lên).

Sau khi thực hiện xong việc “loang”, nếu P[H,O] = 0 thì điều có có nghĩa là ô

[H,O] chưa được “loang” đến (không có đường đi), nếu P[H,O] = r (r=1..4 -

loang theo 4 hướng) thì dựa vào hướng “loang” đến mà ta tìm được ô trước đó,rồi ta lại dựa vào giá trị k của ô tìm được ta tìm được ô trước đó nữa ... quá trình

trên kết thúc khi tìm được ô [K,L].

Sau khi “loang” xong thì giá trị các phần tử trong mảng Q không còn giá trị sửdụng nữa nên ta có thể dùng mảng Q phục vụ cho việc truy xuất kết quả.

Toàn văn chương trình:

Program Bai3_hsg12_09;

Uses Crt;

Const Nmax=100;

Mmax=100;

fi='robot.inp';

fo='robot.out';

Var

f:Text;

s:char;

A,P:Array[1..Mmax,1..Nmax] of Byte;

Q:Array[1..2,1..Mmax*Nmax] of Byte;

M,N,k,l,i,j,dem,dau,cuoi,so,H,O:Byte;

Procedure Doctep;

Page 74: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

75

Begin

Assign(f,fi);

Reset(f);

Readln(f,M,N,k,l,h,o);

For i:=1 to M do

Begin

dem:=0;

While not eoln(f) do

Begin

Read(f,s);

dem:=dem+1;

if s='1' then

A[i,dem]:=1;

if s='0' then

A[i,dem]:=0;

End;

Readln(f);

End;

Close(f);

End;

Procedure Loang;

Begin

dau:=1;

cuoi:=1;

Q[1,dau]:=k;

Q[2,dau]:=l;

Page 75: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

76

Fillchar(P,sizeof(P),0); {Mảng để đánh dấu ô đã duyệt hay chưa, khác 0 là đã

duyệt rồi}

P[k,l]:=5; {Đánh dấu để những lớp sau không phải “loang” đến ô này nữa }

While dau<=cuoi do

Begin

i:=Q[1,dau];

j:=Q[2,dau];

dau:=dau+1;

If (i=h) and (j=o) then Exit;{Đến ô cần đến}

If (i>1) and (P[i-1,j]=0) and (A[i-1,j]=0) then

Begin

P[i-1,j]:=4;{o truoc do ben duoi}

cuoi:=cuoi+1;

Q[1,cuoi]:=i-1;

Q[2,cuoi]:=j;

End;

If (i<M) and (P[i+1,j]=0) and (A[i+1,j]=0) then

Begin

P[i+1,j]:=2;

cuoi:=cuoi+1;

Q[1,cuoi]:=i+1;

Q[2,cuoi]:=j;

End;

If (j>1) and (P[i,j-1]=0) and (A[i,j-1]=0) then

Begin

P[i,j-1]:=3;

Page 76: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

77

cuoi:=cuoi+1;

Q[1,cuoi]:=i;

Q[2,cuoi]:=j-1;

End;

If (j<N) and (P[i,j+1]=0) and (A[i,j+1]=0) then

Begin

P[i,j+1]:=1;

cuoi:=cuoi+1;

Q[1,cuoi]:=i;

Q[2,cuoi]:=j+1;

End;

End;

End;

Procedure Ketqua;

Begin

Assign(f,fo);

Rewrite(f);

If P[h,o]=0 then Writeln(f,'Khong co duong di')

Else

Begin

so:=1;

Writeln(f,'Co duong di');

i:=H;

j:=O;

Q[1,so]:=i;

Q[2,so]:=j;

Page 77: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

78

While (i<>K) or (j<>L) do

Begin

If P[i,j]=1 then

Begin

j:=j-1;

so:=so+1;

Q[1,so]:=i;

Q[2,so]:=j;

End;

If P[i,j]=2 then

Begin

i:=i-1;

so:=so+1;

Q[1,so]:=i;

Q[2,so]:=j;

End;

If P[i,j]=3 then

Begin

j:=j+1;

so:=so+1;

Q[1,so]:=i;

Q[2,so]:=j;

End;

If P[i,j]=4 then

Begin

i:=i+1;

Page 78: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

79

so:=so+1;

Q[1,so]:=i;

Q[2,so]:=j;

End;

End;

For i:=so downto 1 do

Writeln(f,Q[1,i]:4,Q[2,i]:4);

End;

Close(f)

End;

BEGIN

Doctep;

Loang;

Ketqua;

END.

Chương trình trên được trình bày tách bạch từng đối tượng, mỗi đối tượng thực

hiện từng chức năng của nó (ví dụ mảng A, mảng P, mỗi mảng có mỗi chức

năng riêng ...), và điều kiện để thực hiện “loang” theo 4 hướng cũng được nêu ra

rất rõ (ví dụ điều kiện để loang được đến ô phía trên là: (i>1) and (P[i-1,j]=0)

and (A[i-1,j]=0,...).

Tuy nhiên ta nhận thấy rằng trong mảng A thông tin của các ô đã “loang” đến

rồi thực sự không còn quan trọng nữa nên ta có thể dùng chính mảng A để thay

thế chức năng của mảng P. Hàng đợi Q có thể thay đổi mỗi phần tử là một

record HC:

Type

HC = Record

h,c:Byte; {h: lưu chỉ số hàng, c: lưu chỉ số cột}

Page 79: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

80

End;

Từ một ô trong lưới ô vuông (có giá trị các ô là 0/1) “loang” theo 4 hướng, ngoài

cách trình bày như chương trình trên ra, người ta sử dụng kỷ thuật “rào” và 2mảng hằng Hi=(-1,0,1,0) Hj=(0,-1,0,1) để cài đặt chương trình một cách gọn

hơn, trong sáng hơn:

- Kỷ thuật “rào”: Khai báo mảng A: Array[0..Mmax+1,0..Nmax+1] of Byte; rồi

sau đó dùng lệnh SetfillChar(A,SizeOf(A),1); (mảng A được “rào” xung quanhbởi số 1), nhờ vậy mà khi “loang” không cần phải kiểm tra điều kiện của chỉ sốhàng, cột các ô.

- Cách sử dụng 2 mảng hằng Hi=(0,1,0,-1), Hj=(1,0,-1,0):

Khai báo:

Const

Hi:Array[1..4] of Integer=(-1,0,1,0); {Tương ứng với chỉ số hàng, -1:lên,

1:xuống}

Hj:Array[1..4] of Integer=(0,-1,0,1); {Tương ứng với chỉ số cột, -1:trái, 1:phải}

Thực hiện “loang” theo 4 hướng:

.......

i:=Q[dau].h;

j:=Q[dau].c;

Inc(dau);

For r:=1 to 4 do {r=1:lên 2:trái 3:xuống 4:phải}

Begin

x:=i+Hi[r];

y:=j+Hj[r];

If A[x,y]=0 then

Begin

Inc(cuoi);

Page 80: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

81

Q[cuoi].h:=x;

Q[cuoi].c:=y;

A[x,y]:=r;

End;

End;

Trong đoạn chương trình trên ta thấy:

- Với r =1 => Hi[r] = Hi[1] = -1 => i + Hi[1] = i – 1, có nghĩa là chỉ số hàng

giảm đi một đơn vị (1)

Hj[r] = Hj[1] = 0 => j + Hj[1] = j – 0 , có nghĩa là chỉ số cột

không đổi (2)

(1) và (2) <=> thao tác di chuyển đến ô chung cạnh ở phía trên (đi lên).

- Với r =2 => Hi[r] = Hi[2] = 0 => i + Hi[2] = i + 0, có nghĩa là chỉ số hàng

không đổi (3)

Hj[r] = Hj[2] = -1 => j + Hj[2] = j – 1 , có nghĩa là chỉ số cột

giảm đi một đơn vị (4)

(3) và (4) <=> thao tác di chuyển đến ô chung cạnh ở phía bên trái (sang

trái).

- Tương tự với các giá trị khác của r.

Với những vấn đề nêu ra ở trên, chương trình có thể cải tiến lại như sau:

Program Bai3_hsg12_09;

Uses Crt;

Const

Hi:Array[1..4] of Integer=(-1,0,1,0);

Hj:Array[1..4] of Integer=(0,-1,0,1);

Nmax=100;

Mmax=100;

fi='robot.inp';

Page 81: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

82

fo='robot.out';

Type

HC=Record

h,c:Byte;

End;

Var

f:Text;

s:char;

A:Array[0..Mmax+1,0..Nmax+1] of Byte;

Q:Array[1..Mmax*Nmax] of HC;

M,N,k,l,i,j,dem,dau,cuoi,h,o:Integer;

Procedure Doctep;

Begin

Fillchar(A,Sizeof(A),1);{Rào xung quanh}

Assign(f,fi);

Reset(f);

Readln(f,M,N,k,l,h,o);

For i:=1 to M do

Begin

dem:=0;

While not eoln(f) do

Begin

Read(f,s);

dem:=dem+1;

if s='1' then

A[i,dem]:=1;

Page 82: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

83

if s='0' then

A[i,dem]:=0;

End;

Readln(f);

End;

Close(f);

End;

Procedure Loang_Rao;

Var

x,y,r:Byte;

Begin

dau:=1;

cuoi:=1;

Q[dau].h:=k;

Q[dau].c:=l;

A[k,l]:=5;

While dau<=cuoi do

Begin

i:=Q[dau].h;

j:=Q[dau].c;

Inc(dau);

If (i = H) and (j = O) then Exit;

For r:=1 to 4 do {r=1:lên 2:trái 3:xuống 4:phải}

Begin

x:=i+Hi[r];

y:=j+Hj[r];

Page 83: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

84

If A[x,y]=0 then {Nếu ô [x,y] chưa “loang” đến}

Begin

Inc(cuoi);

Q[cuoi].h:=x;

Q[cuoi].c:=y;

A[x,y]:=r;

End;

End;

End;

End;

Procedure Ketqua;

Begin

Assign(f,fo);

Rewrite(f);

If A[H,O]=0 then Writeln(f,'Khong co duong di')

Else

Begin

Writeln(f,'Co duong di');

dem:=1;

Q[dem].h:=h;

Q[dem].c:=o;

i:=h;

j:=o;

While (i<>k) or (j<>l) do

Begin

Inc(dem);

Page 84: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

85

If A[i,j]=1 then

Begin

Q[dem].h:=i+1;

Q[dem].c:=j;

End;

If A[i,j]=2 then

Begin

Q[dem].h:=i;

Q[dem].c:=j+1;

End;

If A[i,j]=3 then

Begin

Q[dem].h:=i-1;

Q[dem].c:=j;

End;

If A[i,j]=4 then

Begin

Q[dem].h:=i;

Q[dem].c:=j-1;

End;

i:=Q[dem].h;

j:=Q[dem].c;

End;

For i:=dem downto 1 do

Writeln(f,Q[i].h,' ',Q[i].c);

End;

Page 85: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

86

Close(f);

End;

BEGIN

Doctep;

Loang_Rao;

Ketqua;

END.

Bài toán 2: Gặp gỡ của hai Robot.

Trên một lưới ô vuông MxN (M,N<100), người ta đặt Robot A ở góc trái trên,

Robot B ở góc phải dưới. Mỗi ô của lưới ô có thể đặt một vật cản hoặc không (ô

trái trên và ô phải dưới không có vật cản). Hai Robot bắt đầu di chuyển đồng

thời với tốc độ như nhau và không Robot nào được dừng lại trong khi Robot kia

di chuyển (trừ khi nó không thể đi được nữa). Tại mỗi bước, Robot chỉ có thể di

chuyển theo 4 hướng - đi lên, đi xuống, sang trái, sang phải - vào các ô kề cạnh.

Hai Robot gặp nhau nếu chúng cùng đứng trong một ô vuông. Bài toán đặt ra là

tìm cách di chuyển ít nhất mà 2 Robot phải thực hiện để có thể gặp nhau.

Dữ liệu vào cho bởi tệp robot.inp:

- Dòng đầu ghi 2 số M, N cách nhau ít nhất một ký tự trống;

- M dòng tiếp theo, mỗi dòng ghi N số 0 hoặc 1 liên tiếp nhau mô tả trạng

thái của các ô vuông: 1 - có vật cản, 0 - không có vật cản.

Dữ liệu ra ghi vào tệp robot.out:

- Nếu 2 Robot không thể gặp nhau thì ghi ký tự ‘#’.

- Ngược lại, ghi hai dòng, mỗi dòng là một dãy các ký tự viết liền nhau

mô tả các bước đi của Robot: U - đi lên, D - đi xuống, L - sang trái, R - sang

phải. Dòng đầu là các bước đi của Robot A, dòng sau là các bước đi của Robot

B.

Page 86: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

87

Ví dụ:

robot.inp robot.out robot.inp robot.out

4 6

011000

000001

001001

010100

DRRR

LULU

3 4

0000

0000

0000

#

Phân tích:

Với dạng bài toán như vậy thì ta nghĩ ngay đến thuật toán Loang để tìm đường

đi cho 2 Robot. Như vậy là phải “loang” từ 2 phía (loang của Robot A và loang

của Robot B). Nhưng vì 2 Robot di chuyển đồng thời trong khi không cho phép

ta cài đặt việc “loang” song song từ 2 phía nên ta phải thiết kế “loang” thế nào

cho hợp lý.

Xin đề xuất một ý tưởng “loang” như sau: Cứ Robot A loang 1 lớp thì dừng lại

để Robot B loang 1 lớp, quá trình đó được lặp đi lặp lại cho đến khi 2 Robot gặp

nhau tại một ô hoặc 1 trong 2 Robot dừng “loang”. Một lớp “loang” ở đây là“loang” từ các phần tử hiện có trong hàng đợi (từ phần tử Queue[dau] đến phần

tử Queue[cuoi]). Sau mỗi lớp “loang”, biến dau và biến cuoi lại được điều chỉnh

để trở thành vị trí đầu và vị trí cuối của các phần tử mới trong Queue. Ta có thểmô tả cụ thể các lớp “loang” của 2 Robot với dữ liệu vào là tệp robot.inp thứ 2

ở trên:

Lớp 1 Lớp 2 Lớp 3

Queue

Robot

A

1 2 1 3 1 2 1 .....

1 1 2 1 1 2 3

Page 87: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

88

Queue

Robot

B

3 3 2 3 2 3 1 ......

4 3 4 2 3 4 4

Lớp 1 Lớp 2 Lớp 3

Q1,Q2 là 2 mảng dùng để biểu diễn cấu trúc hàng đợi để phục vụ việc “loang”của 2 Robot. Trong quá trình “loang” ta phải lưu giữ thông tin hàng, cột của ô

khi “loang” đến, bởi vậy các phần tử của Q1, Q2 là các record có kiểu HC

HC = Record

h,c:Byte; {h: lưu chỉ số hàng, c: lưu chỉ số cột}

end;

Hai hàng đợi Q1, Q2 được khởi tạo như sau:

Procedure KT_Queue;

Begin

dau1:=1;

cuoi1:=1;

Q1[cuoi1]:=1;

Q1[cuoi1]:=1; {Robot A xuất phát từ ô [1,1]}

dau2:=1;

cuoi2:=1;

Q2[cuoi2]:=M;

Q2[cuoi2]:=N; {Robot B xuất phát từ ô [M,N]}

End;

Ngay sau khi khởi tạo thì trong Q1 chứa ô [1,1], Q2 chứa ô [M,N]. Đó là các ôxuất phát để “loang” của 2 Robot.

Page 88: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

89

Mỗi Robot từ một ô có thể “loang” theo bốn hướng: đi xuống, sang trái, đi lên,sang phải; nên để thuận tiện cho việc cài đặt ta sử dụng kỷ thuật “rào”: Mảng

A[i,j] chứa thông tin các ô trong lưới ô vuông được khai báo A:Array[0..Mmax

+ 1,0..Nmax + 1] of Byte (chứ không phải như thông thường là

[1..Mmax,1..Nmax]) và được khởi tạo FillChar(A,SizeOf(A),1) (như vậy là

xung quanh lưới ô vuông được “rào” bới số 1); đồng thời sử dụng 2 mảng hằng

Hi=(1,0,-1,0), Hj=(0,-1,0,1).

Khi đó việc “loang” theo lớp của Robot A được thực hiện như sau:

Procedure LoangA;

Var

k:Byte;

Begin

j:=Cuoi1;

For i:=dau1 to cuoi1 do

For k:=1 to 4 do

Begin

h:= Q1[i].h + Hi[k]; {k=1 - đi xuống, 2 - sang trái, 3 - đi lên, 4 -

sang phải}

c:= Q1[i].c + Hj[k];

If A[h,c] = 0 then {ô [h,c] không có vật cản và chưa “loang” đến}

Begin

Inc(j);

Q1[j].h:= h;

Q1[j].c:= c; {Nạp ô [h,c] vào hàng đợi Q1}

A[h,c]:=k;{Đánh dấu ô bằng cách gán giá trị tương ứng với

hướng loang}

B[h,c]:=True; {Dấu hiệu cho Robot B nhận biết đã gặp

Robot A}

Page 89: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

90

End;

End;

dau1:=cuoi1 + 1;

cuoi1:=j; {Điều chỉnh lại biến dau1, cuoi1 cho các phần tử mới trong Q1}

If dau1 > cuoi1 then ST:=True; {ST=True là Q1 rỗng, kết thúc “loang”}

End;

Việc “loang” theo lớp của Robot B cũng tương tự như Robot A nhưng chỉ khác

ở chổ khi “loang” đến một ô [h,c] nào đó thì phải xét dấu hiệu B[h,c] xem thử đã

gặp Robot A chưa:

........

If B[h,c] then {Nếu tại ô [h,c] Robot B gặp Robot A thì}

Begin

lk:=k; {Lưu lại giá trị tương ứng với hướng “loang” để lấy kết quả}

hm:=h; {Lưu lại chỉ số hàng của ô mà 2 Robot gặp nhau để lấy kết

quả}

cm:=c; {Lưu lại chỉ số cột của ô mà 2 Robot gặp nhau để lấy kết

quả}

TT:=True; {Dấu hiệu dừng “loang” của 2 Robot vì đã gặp nhau}

Exit;

End;

.........

Sở dĩ ta phải lưu lại giá trị tương ứng với hướng “loang” (lk:=k) là vì tại ô gặp

nhau [h,c] Robot A đã “loang” đến trước nên đã gán giá trị của A[h,c] bằng giá

trị tương ứng với hướng “loang” đến nên khi Robot B “loang” đến ô [h,c] buộc

ta phải lưu lại giá trị tương ứng với hướng “loang” vào biến lk để sau này truy

xuất đường đi của Robot B.

Quá trình “loang” theo từng lớp của 2 Robot được thực hiện như sau:

Procedure Loang_lop;

Page 90: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

91

Begin

TT:=False;

ST:=False;

While (ST=False) and (TT=False) do

Begin

FillChar(B,SizeOf(B),False); {Đánh dấu theo từng lớp loang}

Loang1;

Loang2;

End;

End;

Lệnh đánh dấu theo từng lớp “loang” tại vị trí như ở trên:

FillChar(B,SizeOf(B),False) là rất quan trọng vì Robot B gặp Robot A tại ô [h,c]

chỉ khi B[h,c] = True tại thời điểm lớp “loang” của Robot A cùng lớp “loang”với Robot B. Còn nếu B[h,c] = True của lớp “loang” trước nào đó của Robot A

thì không thể kết luận 2 Robot gặp nhau vì khi đó 2 Robot sẽ di chuyển khập

khểnh chứ không đồng thời.

Việc lấy kết quả dựa vào giá trị của biến TT: TT=True - Hai Robot gặp nhau,

TT=False - Hai Robot không gặp nhau.

Trong trường hợp gặp nhau thì dựa vào việc đã lưu thông tin ô gặp nhau vào 2

biến hm ,cm (hm - chỉ số hàng, cm - chỉ số cột) ta sẽ truy xuất đường đi của 2

Robot.

Toàn văn chương trình:

{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+}

{$M 16384,0,655360}

Program Gapgo;

Uses Crt;

Const

Page 91: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

92

Mmax=100;

Nmax=100;

Hi:Array[1..4] of Integer=(1,0,-1,0);

Hj:Array[1..4] of Integer=(0,-1,0,1);

fi='robot.inp';

fo='robot.out';

Type

HC=Record

h,c:Byte;

End;

Var

A:Array[0..Mmax+1,0..Nmax+1] of Byte;

B:Array[0..Mmax+1,0..Nmax+1] of Boolean;

Q1,Q2:Array[1..Mmax*Nmax] of HC;

M,N,i,j,dem,dau1,cuoi1,dau2,cuoi2,hm,cm,lk:Word;

f:Text;

s:char;

ST,TT:Boolean; {Robot A hoặc Robot B loang hết thì ST=True; nếu gặp nhau

thì TT=True}

Procedure Doctep;

Begin

FillChar(A,Sizeof(A),1);{Rào xung quanh}

Assign(f,fi);

Reset(f);

Readln(f,M,N);

For i:=1 to M do

Page 92: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

93

Begin

dem:=0;

While not eoln(f) do

Begin

dem:=dem+1;

Read(f,s);

If s='0' then A[i,dem]:=0

else A[i,dem]:=1;

End;

Readln(f);

End;

Close(f);

End;

Procedure KT_Queue; {Khởi tạo 2 hàng đợi Q1 và Q2}

Begin

dau1:=1;

cuoi1:=1;

Q1[cuoi1].h:=1;

Q1[cuoi1].c:=1;

dau2:=1;

cuoi2:=1;

Q2[cuoi2].h:=M;

Q2[cuoi2].c:=N;

End;

Procedure LoangA;

Var

Page 93: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

94

k,h,c:Byte;

Begin

j:=cuoi1;

For i:=dau1 to cuoi1 do

For k:=1 to 4 do

Begin

h:=Q1[i].h + Hi[k];

c:=Q1[i].c + Hj[k];

If A[h,c] = 0 then

Begin

Inc(j);

Q1[j].h:=h;

Q1[j].c:=c;

A[h,c]:=k;

B[h,c]:=True;

End;

End;

dau1:=cuoi1+1;

cuoi1:=j;

If dau1>cuoi1 then ST:=True;

End;

Procedure LoangB;

Var

k,h,c:Byte;

Begin

j:=cuoi2;

Page 94: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

95

For i:=dau2 to cuoi2 do

For k:=1 to 4 do

Begin

h:=Q2[i].h + Hi[k];

c:=Q2[i].c + Hj[k];

If A[h,c]=0 then

Begin

Inc(j);

Q2[j].h:=h;

Q2[j].c:=c;

A[h,c]:=k;

End;

If B[h,c] then

Begin

lk:=k;

hm:=h;

cm:=c;

TT:=True;

Exit;

End;

End;

dau2:=cuoi2+1;

cuoi2:=j;

if dau2>cuoi2 then ST:=True;

End;

Procedure Loang_lop;

Page 95: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

96

Begin

TT:=False;

ST:=False;

While (ST=False) and (TT=False) do

Begin

FillChar(B,SizeOf(B),False); {Đánh dấu theo từng lớp loang}

LoangA;

LoangB;

End;

End;

Procedure Ketqua;

Var

k:Byte;

s1,s2:String;

Begin

s1:='';

s2:='';

Assign(f,fo);

Rewrite(f);

If TT=False then Writeln(f,'#')

else

Begin

{Đường đi của Robot A}

i:=hm;

j:=cm;

Repeat

Page 96: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

97

k:=A[i,j];

Case k of

1: s1:=s1+'D';

2: s1:=s1+'L';

3: s1:=s1+'U';

4: s1:=s1+'R';

End;

i:=i+Hi[k];

j:=j+Hj[k];

Until (i=1) and (j=1);

{Đường đi của Robot B}

i:=hm;

j:=cm;

A[i,j]:=lk;

Repeat

k:=A[i,j];

Case k of

1: s2:=s2+'D';

2: s2:=s2+'L';

3: s2:=s2+'U';

4: s2:=s2+'R';

End;

i:=i+Hi[k];

j:=j+Hj[k];

Until (i=M) and (j=N);

For i:=Length(s1) downto 1 do

Page 97: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

98

Write(f,s1[i]);

Writeln(f);

For i:=Length(s2) downto 1 do

Write(f,s2[i]);

End;

Close(f);

End;

BEGIN

Doctep;

KT_Queue;

Loang_lop;

Ketqua;

END.

Page 98: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

99

PHƯƠNG PHÁP QUY HOẠCH ĐỘNG TRẠNG THÁI

Nguyễn Duy Dũng - Trường THPT Chuyên Hà Tĩnh

ĐẶT VẤN ĐỀ

Quy hoạch động là một phương pháp thường được sử dụng để giải các bài toán

trong tin học. Trong một số bài toán giải bằng phương pháp này khi xét tại mỗi

bước thường có nhiều khả năng lựa chọn ta gọi là các trạng thái. Chẳng hạn đểtìm lời giải cho bài toán ta đi lần lượt từ bước 1 đến bước thứ K, tại bước thứ i

có nhiều lựa chọn (trạng thái) khác nhau, để tìm hướng đi đúng cho bước thứ i

lại dựa vào các trạng thái của bước thứ i-1 và có thể xác định bằng một công

thức cụ thể nếu tập các trạng thái là hữu hạn. Khi gặp các bài toán loại này ta

thường giải bằng phương pháp quy hoạch động trạng thái.

Trong quá trình giảng dạy các lớp chuyên tin học và ôn luyện học sinh giỏi quốc

gia, tôi nhận thấy tài liệu viết về vấn đề này rất hạn chế. Để hiểu hơn về phươngpháp này chúng ta cùng tìm hiểu một bài toán cụ thể.

BÀI TOÁN

Chọn ô - HSG QG 2006 (SELECT)

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 aij , 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.

Tìm cách chọn sao cho trọng lượng là lớn nhất.

Ví dụ: Xét bảng với n=3 trong hình vẽ dưới đây:

Page 99: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

100

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.

Input

Dòng đầu tiên chứa số nguyên dương n là số cột của bảng.

Cột thứ j trong số n cột tiếp theo chứa 4 số nguyên a1j, a2j, a3j, a4j, hai số liên tiếp

cách nhau ít nhất một dấu cách, là 4 số trên cột j của bảng.

Output

Gồm 1 dòng duy nhất là trọng lượng của cách chọn tìm được.

Example

Input Output

3

-1 9 3

-4 5 -6

7 8 9

9 7 2

32

Hạn chế

Trong tất cả các test: n ≤ 10000, |aij| ≤ 30000. Có 50% số lượng test với n ≤1000.

GIẢI THUẬT VÀ CÀI ĐẶT

Page 100: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

101

Tư tưởng chính:

Mỗi cột có 4 dòng nên ta có thể dùng dãy nhị phân gồm 4 bít để biểu diễn. Tùy

vào giá trị của bít thứ k của cột thứ i bằng 0 hoặc1 cho biết dòng thứ k của cột

thứ i có được chọn hay không. (0 ≤ k ≤ 3)

Dãy nhị phân có 4 bít ứng với 24 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.

Ta có công thức quy hoạch động như sau:

F[i,x]=max(F[i-1,y])+sum(i,x)

Trong đó:

Biến x và y là hai 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 bít thứ k của biến x phải khác bít 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ử dụng một số hàm như sau:

+) Lấy giá trị bít 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 không (không có hai

ô nào có chung cạnh), nghĩa là bít thứ k và bít thứ k-1 của trạng thái x phải khác

nhau:

Page 101: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

102

Function Ok(x:word):boolean;

Begin

Ok:=false;

For k:=1 to 3 do

If (getbit(k-1,x)=1)and(getbit(k,x)=1) then

Exit;

Ok:=true;

End;

+) Hàm kiểm tra trạng thái x và trạng thái y có thỏa mãn yêu cầu bài toán không

(không có hai ô nào có chung cạnh), nghĩa là bít thứ k của trạng thái x và bít thứk-1 của trạng thái y phải khác nhau:

Function Check(x,y:word):boolean;

Begin

Check:=false;

For k:=0 to 3 do

If (getbit(k,x)=1)and(getbit(k,y)=1) then

Exit;

Check:=true;

End;

+) Tính trọng lượng của cột thứ i ứng với trạng thái x:

Function sum(i,x:word):longint;

Var T:longint;

Begin

T:=0;

For k:=0 to 3 do

Page 102: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

103

If (getbit(k,x)=1) then

T:= T+A[k+1,i];

Sum:=T;

End;

+) Thủ tục chính:

Procedure process;

Var max:longint;

y,i:word;

Begin

For i:=1 to n do {Xét lần lượt n cột}

For x:=0 to m do {Với mỗi cột i xét 24 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 m do

If check(x,y)and(ok(y))then

If max<F[i-1,y] then

max:=F[i-1,y];

F[i,x]:=max+sum(i,x)

End;

End;

+) Thủ tục in kết quả:

Procedure printresult;

Page 103: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

104

Var Max:longint;

ff:text;

Begin

{Chú ý thêm trường hợp tất cả A[i,j]<0}

{Tìm giá trị lớn nhất trong các trạng thái của cột thứ n} Max:=-vc;

For x:=0 to m do

If ok(x)and (max<F[n,x]) then

Max:=F[n,x];

Assign(ff,fo); rewrite(ff);

Writeln(ff,max);

Close(ff);

End;

Nhận xét

Độ phức tạp thuật toán: O(24*24*N) đủ để giải quyết bài toán trên.

Để giảm độ phức tạp của thuật toán ta có thể dùng 1 mảng B lưu những trạng

thái thỏa mãn yêu cầu không có hai ô nào cùng cột có chung cạnh kết hợp với

cấu trúc dữ liệu Foward Star để ứng với mỗi trạng thái x ta có danh sách các

trạng thái y thỏa mãn.

MỘT SỐ BÀI TOÁN ỨNG DỤNG

Bài 1: Chuyến du lịch (TRIP)

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.

Page 104: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

105

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 ).

Bạn hãy giúp sherry tìm 1 hành trình đi qua tất cả các nước, mỗi nước đúng 1lần sao cho chi phí là bé nhất nhé.

Input

Dòng 1: N (5 < N < 16)

Dòng thứ i trong N dòng tiếp theo: Gồm N số nguyên, số thứ j là Cij (0 < Cij <

10001)

Output

Gồm 1 dòng duy nhất ghi chi phí bé nhất tìm được

Example

Input Output

6

0 1 2 1 3 4

5 0 3 2 3 4

4 1 0 2 1 2

4 2 5 0 4 3

2 5 3 5 0 2

5 4 3 3 1 0

8

Hướng dẫn:

Ta nhận thấy đây là bài toán tìm đường đi Hamilton, một bài toán khá quen

thuộc: cho N đỉnh, tìm đường đi sao cho mỗi đỉnh được thăm duy nhất một lần,

và chi phí thăm N đỉnh là thấp nhất.

Với dạng toán này, thông thường nếu N nhỏ (≤10), ta có thể giải quyết bài toán

bằng phương pháp nhánh cận. Nhưng nếu giới hạn N tăng lên đến 20, thì việc sửdụng phương pháp nhánh cận để giải quyết sẽ không còn khả thi nữa. Trong

Page 105: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

106

trường hợp này, ta có cách tiếp cận khác để giải quyết bài toán một cách tối ưuhơn, với độ phức tạp O(N2*2N).

Dãy nhị phân có N bít ứng với 2n trạng thái, biểu diễn từ 0 tới 2n-1 cho biết các

đỉnh đã được thăm hay chưa.

Gọi F[i,x] là tổng chi phí nếu sherry đang ở Đất nước i và trạng thái các nước đã

đi qua được lưu vào biến.

Công thức Quy hoạch động:

F[i,x] = min( F[j,y] + C[j,i] )

Trong Đó

- j là đất nước đã được đánh dấu đi qua trong x.

- y là trạng thái giống như trạng thái x nhưng đất nước i chưa được đánh dấu.

Bài 2: Cô gái chăn bò (COWGIRL)

Trên một thảo nguyên nhỏ bé có 1 gia đình gồm 3 anh em: 2 người anh trai là

Nvutri và Andorea còn người em gái là Lola. Cuộc sống gia đình khá giả nhưnggia đình có truyền thống chăn nuôi và muốn để các con tự lập nên cha mẹ 3

người quyết định để các con hằng ngày sẽ đi chăn 1 số bò nào đó (tùy ý 3 người

con).

Thảo nguyên là 1 cánh đồng chia làm M*N ô vuông, mỗi con bò chỉ đứng trong

1 ô và mỗi ô chỉ chứa 1 con bò.Chỉ có 1 quy tắc duy nhất là không bao giờ được

để 4 con bò tạo thành 1 hình vuông 2*2 hoặc để trống 1 khu đất 2*2.

Hai người anh mải chơi nên đã hối lộ kem để Lola chăn bò 1 mình. Lola muốn

biết tất cả có bao nhiêu cách xếp bò thỏa mãn quy tắc trên để đề phòng mọi

trường hợp. Vì con số này rất lớn nên hãy giúp Lola tính toán con số này.

Input

Dòng đầu gồm 1 số T duy nhất là số test (T ≤ 111)

T dòng tiếp theo gồm 2 số M, N cho biết kích thước của thảo nguyên (M*N ≤30)

Page 106: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

107

Output

Gồm T dòng, mỗi dòng ứng với 1 test là số cách xếp bò của test đó.

Example

Input Output

1 1

1

2

Hướng dẫn:

Ta thấy M*N<=30 nên tồn tại một số M hay N không lớn hơn 5. Giả sử là M

là số dòng không quá 5. Ta có thể sử dụng số có không quá 5 bit nhị phân Để mô

tả trạng thái chọn ở mỗi cột.

Gọi F[i,x] là số cách xếp bò thỏa mãn yêu cầu bài toán 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..

Công thức Quy hoạch động:

F[i,x] = F[i,x] + F[i-1,y] )

Bài 3: Đàn bò hỗn loạn (MIXUP)

Mỗi trong N cô bò (4 <= N <= 16) của bác John có một số seri phân biệt S_i (1

<= S_i <= 25,000). Các cô bò tự hào đến nỗi mỗi cô đều đeo một chiếc vòng

vàng có khắc số seri của mình trên cổ theo kiểu các băng đảng giang hồ.

Các cô bò giang hồ này thích nổi loạn nên đứng xếp hàng chờ vắt sữa theo một

thứ tự gọi được gọi là 'hỗn loạn'.

Một thứ tự bò là 'hỗn loạn' nếu trong dãy số seri tạo bởi hàng bò, hai số liên tiếp

khác biệt nhau nhiều hơn K (1 <= K <= 3400). Ví dụ, nếu N = 6 và K = 1 thì 1,

3, 5, 2, 6, 4 là một thứ tự 'hỗn loạn' nhưng 1, 3, 6, 5, 2, 4 thì không (vì hai số liên

tiếp 5 và 6 chỉ chênh lệch 1).

Page 107: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

108

Hỏi có bao nhiêu cách khác nhau để N cô bò sắp thành thứ tự 'hỗn loạn'?

Input

* Dòng 1: Hai số N và K cách nhau bởi khoảng trắng.

* Dòng 2..N+1: Dòng i+1 chứa một số nguyên duy nhất là số seri của cô bò thứi: S_i

Output

* Dòng 1: Một số nguyên duy nhất là số cách để N cô bò sắp thành thứ tự 'hỗn

loạn'. Kết quả đảm bảo nằm trong phạm vi kiểu số nguyên 64-bit.

Example

Input Output

4 1

3

4

2

1

2

Page 108: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

109

PHƯƠNG PHÁP QUY HOẠCH ĐỘNG

Nông Thị Hoàng Mai, Chuyên Thái Nguyên

Nguyên lý tối ưu của Bellman

Phương pháp quy hoạch động cùng nguyên lý tối ưu được nhà toán học MỹR.Bellman đề xuất vào những năm 50 của thế kỷ 20. Phương pháp này đã được

áp dụng để giải hàng loạt bài toán thực tế trong các quá trình kỹ thuật cộng

nghệ, tổ chức sản xuất, kế hoạch hoá kinh tế…

Trong thực tế, ta thường gặp một số bài toán tối ưu loại sau: Có một đại

lượng f hình thành trong một quá trình gồm nhiều giai đoạn và ta chỉ quan tâm

đến kết quả cuối cùng là giá trị của f phải lớn nhất hoặc nhỏ nhất, ta gọi chung là

giá trị tối ưu của f. Giá trị của f phụ thuộc vào những đại lượng xuất hiện trong

bài toán mà mỗi bộ giá trị của chúng được gọi là một trạng thái của hệ thống và

phụ thuộc vào cách thức đạt được giá trị f trong từng giai đoạn mà mỗi cách tổchức được gọi là một điều khiển. Đại lượng f thường được gọi là hàm mục tiêu

và quá trình đạt được giá trị tối ưu của f được gọi là quá trình điều khiển tối ưu.

Bellman phát biểu nguyên lý tối ưu (cũng gọi là nguyên lý Bellman) mà ý

tưởng cơ bản là như sau: “Với mỗi quá trình điều khiển tối ưu, đối với trạng thái

bắt đầu A0, với trạng thái A trong quá trình đó, phần quá trình kể từ trạng thái A

xem như trạng thái bắt đầu cũng là tối ưu”.

Chú ý rằng nguyên lý này được thừa nhận mà không chứng minh.

Phương pháp tìm điều khiển tối ưu theo nguyên lý Bellman thường được

gọi là quy hoạch động. Thuật ngữ này nói lên thực chất của quá trình điều khiển

là động: có thể trong một số bước đầu tiên lựa chọn điều khiển tối ưu dường nhưkhông tốt nhưng tựu chung cả quá trình lại là tốt nhất.

Hiểu một cách đơn giản hơn quy hoạch động là phương pháp giải bài toántừ nhỏ đến lớn, việc giải – tìm phương án tối ưu của các bài toán nhỏ và lưu trữcác kết quả này lại sẽ giúp ta có thể giải các bài toán với kích thước lớn dần đếnkhi đạt được kết quả mong muốn.

Ý tưởng và nội dung của phương pháp quy hoạch động

Page 109: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

110

Xét bài toán sau:

Cho một dãy N số nguyên A1, A2,…,AN. Hãy tìm cách xoá đi một số ít nhất

số hạng để dãy còn lại là đơn điệu hay nói cách khác hãy chọn một số nhiều nhất

các số hạng sao cho dãy B gồm các số hạng đó theo trình tự xuất hiện trong dãy

A là đơn điệu.

Quá trình chọn B được điều khiển qua N giai đoạn để đạt được mục tiêu là

số lượng số hạng của dãy B là nhiều nhất, điều khiển ở giai đoạn i thể hiện việc

chọn hay không chọn Ai vào dãy B.

Giả sử dãy đã cho là 1 8 10 2 4 6 7. Nếu ta chọn lần lượt 1, 8, 10 thì chỉchọn được 3 số hạng nhưng nếu bỏ qua 8 và 10 thì ta chọn được 5 số hạng 1, 2,

4, 6, 7.

Khi giải một bài toán bằng cách “chia để trị” chuyển việc giải bài toán kích

thước lớn về việc giải nhiều bài toán cùng kiểu có kích thước nhỏ hơn thì thuật

toán này thường được thể hiện bằng các chương trình con đệ quy. Khi đó, trênthực tế, nhiều kết quả trung gian phải tính nhiều lần.

Vậy ý tưởng cơ bản của quy hoạch động là : Tránh tính toán lại mọi thứhai lần, mà lưu giữ kết quả đã tìm kiếm được vào một bảng làm giả thiết cho

việc tìm kiếm những kết quả của trường hợp sau.

Chúng ta sẽ làm đầy dần giá trị của bảng này bởi các kết quả của những

trường hợp trước đã được giải. Kết quả cuối cùng chính là kết quả của bài toán

cần giải. Nói cách khác phương pháp quy hoạch động đã thể hiện sức mạnh của

nguyên lý chia để trị đến cao độ.

Quy hoạch động là kỹ thuật thiết kế bottom-up (từ dưới lên). Nó được bắt

đầu với những trường hợp con nhỏ nhất (thường là đơn giải nhất và giải được

ngay). Bằng cách tổ hợp các kết quả đã có (không phải tính lại) của các trường

hợp con, sẽ đạt đạt tới kết quả của trường hợp có kích thước lớn dần lên và tổng

quát hơn, cho đến khi cuối cùng đạt tới lời giải của trường hợp tổng quát nhất.

Trong một số trường hợp, khi giải một bài toán A, trước hết ta tìm họ bài

toán A(p) phụ thuộc tham số p (có thể p là một véc tơ) mà A(p0)=A với p0 là

trạng thái ban đầu của bài toán A. Sau đó tìm cách giải họ bài toán A(p) với tham

Page 110: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

111

số p bằng cách áp dụng nguyên lý tối ưu của Bellman. Cuối cùng cho p=p0 sẽnhận được kết quả của bài toán A ban đầu.

Các bước thực hiện

Bước 1: Lập hệ thức

Dựa vào nguyên lý tối ưu tìm cách chia quá trình giải bài toán thành 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 các bước đã xử lý trước đó. Hoặc tìm cách phân rã bài toán thành các “bàitoán con” tương tự có kích thước nhỏ hơn, tìm hệ thức nêu quan hệ giữa kết quảbài toán kích thước đã cho với kết quả của các “bài toán con” cùng kiểu có kích

thước nhỏ hơn của nó nhằm xây dựng phương trình truy toán (dạng hàm hoặc

thủ tục đệ quy).

Về một cách xây dựng phương trình truy toán:

Ta chia việc giải bài toán thành n giai đoạn. Mỗi giai đoạn i có trạng thái

ban đầu là t(i) và chịu tác động điều khiển d(i) sẽ biến thành trạng thái 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 làm ảnh hưởng đến kết quả toàn bài toán.

Với trạng thái ban đầu là t(n) sau khi làm giai đoạn n tốt nhất ta có trạng thái ban

đầu của giai đoạn n-1 là t(n-1) và tác động điều khiển của giai đoạn n-1 là d(n-

1), có thể tiếp tục 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) và d(n-2) và lại có thể tối ưu giai đoạn n-2 … cho đến khi các giai đoạn từn giảm đến 1 được tối ưu thì coi như hoàn thành bài toán. Gọi giá trị tối ưu của

bài toán tính đến giai đoạn k là Fk, giá trị tối ưu của bài toán tính riêng ở giai

đoạn k là Gk thì

Fk = Fk-1 + Gk

Hay là: (*)}))1(())(),(({G))(( 1k)(

1

ktFkdktaxmktF kkd

Bước 2: Tổ chức dữ liệu và chương trình

Tổ chức dữ liệu sao cho đạt các yêu cầu sau:

Dữ liệu được tính toán dần theo các bước.

Dữ liệu được lưu trữ để giảm lượng tính toán lặp lại.

Page 111: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

112

Kích thước miền nhớ dành cho lưu trữ dữ liệu càng nhỏ càng tốt, kiểu dữliệu được chọn phù hợp, nên chọn đơn giản dễ truy cập.

Cụ thể

Các giá trị của Fk thường được lưu trữ trong một bảng (mảng một chiều

hoặc hai, ba, v.v… chiều).

Cần lưu ý khởi trị các giá trị ban đầu của bảng cho thích hợp, đó là các kết

quả của các bài toán con có kích cỡ nhỏ nhất của bài toán đang giải:

}))0(())1(),1(({G))1(( 01)1(

1 tFdtaxmtFd

Dựa vào công thức, phương trình truy toán (*) và các giá trị đã có trong

bảng để tìm dần các giá trị còn lại của bảng.

Ngoài ra còn cần mảng lưu trữ nghiệm tương ứng với các giá trị tối ưutrong từng gian đoạn.

Dựa vào bảng lưu trữ nghiệm và bảng giá trị tối ưu trong từng giai đoạn đã

xây dựng, tìm ra kết quả bài toán.

Bước 3: Làm tốt

Làm tốt thuật toán bằng cách thu gọn hệ thức (*) và giảm kích thước miền

nhớ. Thường tìm cách dùng mảng một chiều thay cho mảng hai chiều nếu giá trịmột dòng (hoặc cột) của mảng hai chiều chỉ phụ thuộc một dòng (hoặc cột) kềtrước.

Trong một số trường hợp có thể thay mảng hai chiều với các giá trị phần tửchỉ nhận giá trị 0, 1 bởi mảng hai chiều mới bằng cách dùng kỹ thuật quản lý bit.

Ví dụ minh họa

Cho số tự nhiên n ≤ 100. Hãy cho biết có bao nhiêu cách phân tích số n

thành tổng của dãy các số nguyên dương, các cách phân tích là hoán vị của

nhau chỉ tính là một cách.

n = 5 có 7 cách phân tích:

5 = 1 + 1 + 1 + 1 + 1

5 = 1 + 1 + 1 + 2

Page 112: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

113

5 = 1 + 1 + 3

5 = 1 + 2 + 2

5 = 1 + 4

5 = 2 + 3

5 = 5

(Lưu ý: n = 0 vẫn coi là có 1 cách phân tích thành tổng các số nguyên

dương (0 là tổng của dãy rỗng)

Page 113: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

114

Bước 1: Lập hệ thức

Nhận xét:

Nếu gọi F[m, v] là số cách phân tích số v thành tổng các số nguyên

dương ≤ m. Khi đó: Các cách phân tích số v thành tổng các số nguyên dương ≤m có thể chia làm hai loại:

Loại 1: Không chứa số m trong phép phân tích, khi đó số cách phân tích

loại này chính là số cách phân tích số v thành tổng các số nguyên dương < m,tức là số cách phân tích số v thành tổng các số nguyên dương ≤ m - 1 và bằng

F[m - 1, v].

Loại 2: Có chứa ít nhất một số m trong phép phân tích. Khi đó nếu trong

các cách phân tích loại này ta bỏ đi số m đó thì ta sẽ được các cách phân tích sốv - m thành tổng các số nguyên dương ≤ m (Lưu ý: điều này chỉ đúng khi khôngtính lặp lại các hoán vị của một cách). Có nghĩa là về mặt số lượng, số các cách

phân tích loại này bằng F[m, v - m]

Trong trường hợp m > v thì rõ ràng chỉ có các cách phân tích loại 1, còn

trong trường hợp m ≤ v thì sẽ có cả các cách phân tích loại 1 và loại 2. Vì thế:

F[m 1, v]; if m > vF[m, v]=

F[m-1,v]+F[m,v-m]; if m v

Bước 2: Tổ chức dữ liệu và chương trình

Ta có công thức xây dựng F[m, v] từ F[m - 1, v] và F[m, v - m]. Công thức

này có tên gọi là công thức truy hồi đưa việc tính F[m, v] về việc tính các F[m',

v'] với dữ liệu nhỏ hơn. Tất nhiên cuối cùng ta sẽ quan tâm đến F[n, n]: Số các

cách phân tích n thành tổng các số nguyên dương ≤ n.

Ví dụ với n = 5, bảng F sẽ là:

F 0 1 2 3 4 5 V

0 1 0 0 0 0 0

1 1 1 1 1 1 1

Page 114: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

115

2 1 1 2 2 3 3

3 1 1 2 3 4 5

4 1 1 2 3 5 6

5 1 1 2 3 5 7

m

Nhìn vào bảng F, ta thấy rằng F[m, v] được tính bằng tổng của:

Một phần tử ở hàng trên: F[m - 1, v] và một phần tử ở cùng hàng, bên trái:

F[m, v - m].

Cài đặt:

program Analysis_Counting;

const max = 100;

var

F: array[0..max, 0..max] of Integer;

n, m, v: Integer;

begin

Write('n = '); ReadLn(n);

FillChar(F[0], SizeOf(F[0]), 0);

F[0, 0] := 1;

for m := 1 to n do

for v := 0 to n do

if v < m then F[m, v] := F[m - 1, v]

else F[m, v] := F[m - 1, v] + F[m, v - m];

WriteLn(F[n, n], ' Analyses');

end.

Page 115: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

116

Bước 3: Làm tốt

Cải tiến dùng 2 mảng 1 chiều

Cách làm trên có thể tóm tắt lại như sau: Khởi tạo dòng 0 của bảng, sau đódùng dòng 0 tính dòng 1, dùng dòng 1 tính dòng 2 v.v… tới khi tính được hết

dòng n. Có thể nhận thấy rằng khi đã tính xong dòng thứ k thì việc lưu trữ các

dòng từ dòng 0 tới dòng k - 1 là không cần thiết bởi vì việc tính dòng k + 1 chỉphụ thuộc các giá trị lưu trữ trên dòng k. Vậy ta có thể dùng hai mảng một

chiều: Mảng Current lưu dòng hiện thời đang xét của bảng và mảng Next lưudòng kế tiếp, đầu tiên mảng Current được gán các giá trị tương ứng trên dòng 0.

Sau đó dùng mảng Current tính mảng Next, mảng Next sau khi tính sẽ mang các

giá trị tương ứng trên dòng 1. Rồi lại gán mảng Current := Next và tiếp tục dùng

mảng Current tính mảng Next, mảng Next sẽ gồm các giá trị tương ứng trên

dòng 2 v.v… Vậy ta có cài đặt cải tiến sau:

program Analysis_Counting_2;

const max = 100;

var

Current, Next: array[0..max] of Integer;

n, m, v: Integer;

begin

Write('n = '); ReadLn(n);

FillChar(Current, SizeOf(Current), 0);

Current[0] := 1;

for m := 1 to n do

begin

for v := 0 to n do

if v < m then Next[v] := Current[v]

else Next[v] := Current[v] + Next[v - m];

Current := Next;

Page 116: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

117

end;

WriteLn(Current[n], ' Analyses');

end.

5. Một số bài toán tối ưu giải bằng phương pháp quy hoạch động

Bài toán 1: Bài toán cái túi

Trong siêu thị có n gói hàng (n ≤ 100), gói hàng thứ i có trọng lượng là

W[i] ≤ 100 và trị giá V[i] ≤ 100. Một tên trộm đột nhập vào siêu thị, tên trộm

mang theo một cái túi có thể mang được tối đa trọng lượng M (M ≤ 100). 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.

Input: file văn bản BAG.INP

Dòng 1: Chứa hai số n, M cách nhau ít nhất một dấu cách

n dòng tiếp theo, dòng thứ i chứa hai số nguyên dương W[i], V[i] cách

nhau ít nhất một dấu cách

Output: file văn bản BAG.OUT

Dòng 1: Ghi giá trị lớn nhất tên trộm có thể lấy

Dòng 2: Ghi chỉ số những gói bị lấy

BA

G.INP

BAG.

OUT

5 11

3 3

4 4

5 4

9 10

4 4

11

5 2 1

Bài giải:

Page 117: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

118

Nếu gọi F[i, j] là giá trị lớn nhất có thể có bằng cách chọn trong các gói {1,

2, …, i} với giới hạn trọng lượng j. Thì giá trị lớn nhất khi được chọn trong số n

gói với giới hạn trọng lượng M chính là F[n, M].

Công thức truy hồi tính F[i, j].

Với giới hạn trọng lượng j, việc chọn tối ưu trong số các gói {1, 2, …, i - 1,

i} để có giá trị lớn nhất sẽ có hai khả năng:

Nếu không chọn gói thứ i thì F[i, j] là giá trị lớn nhất có thể bằng cách chọn

trong số các gói {1, 2, …, i - 1} với giới hạn trọng lượng là j. Tức là F[i, j] = F[i

- 1, j]

Nếu có chọn gói thứ i (tất nhiên chỉ xét tới trường hợp này khi mà W[i] ≤ j)

thì F[i, j] bằng giá trị gói thứ i là V[i] cộng với giá trị lớn nhất có thể có được

bằng cách chọn trong số các gói {1, 2, …, i - 1} với giới hạn trọng lượng j -

W[i]. Tức là về mặt giá trị thu được: F[i, j] = V[i] + F[i - 1, j - W[i]]

Vì theo cách xây dựng F[i, j] là giá trị lớn nhất có thể, nên F[i, j] sẽ là Max

trong 2 giá trị thu được ở trên.

Cơ sở quy hoạch động:

Dễ thấy F[0, j] = giá trị lớn nhất có thể bằng cách chọn trong số 0 gói = 0.

Tính bảng phương án:

Bảng phương án F gồm n + 1 dòng, M + 1 cột, trước tiên được điền cơ sởquy hoạch động: Dòng 0 gồm toàn số 0. Sử dụng công thức truy hồi, dùng dòng

0 tính dòng 1, dùng dòng 1 tính dòng 2, v.v… đến khi tính hết dòng n.

Truy vết

Tính xong bảng phương án thì ta quan tâm đến F[n, M] đó chính là giá trịlớn nhất thu được khi chọn trong cả n gói với giới hạn trọng lượng M. Nếu F[n,

M] = F[n - 1, M] thì tức là không chọn gói thứ n, ta truy tiếp F[n - 1, M]. Còn

nếu F[n, M] ≠ F[n - 1, M] thì ta thông báo rằng phép chọn tối ưu có chọn gói thứn và truy tiếp F[n - 1, M - W[n]]. Cứ tiếp tục cho tới khi truy lên tới hàng 0 của

bảng phương án.

program Bag;

Page 118: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

119

const

InputFile = 'BAG.INP';

OutputFile = 'BAG.OUT';

max = 100;

var

W, V: Array[1..max] of Integer;

F: array[0..max, 0..max] of Integer;

n, M: Integer;

procedure Enter;

var

i: Integer;

fi: Text;

begin

Assign(fi, InputFile); Reset(fi);

ReadLn(fi, n, M);

for i := 1 to n do ReadLn(fi, W[i], V[i]);

Close(fi);

end;

procedure Optimize;

var

i, j: Integer;

begin

FillChar(F[0], SizeOf(F[0]), 0);

for i := 1 to n do

for j := 0 to M do

begin {Tính F[i, j]}

Page 119: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

120

F[i, j] := F[i - 1, j];

if (j >= W[i]) and (F[i, j] < F[i - 1, j - W[i]] + V[i]) then

F[i, j] := F[i - 1, j - W[i]] + V[i];

end;

end;

procedure Trace;

var

fo: Text;

begin

Assign(fo, OutputFile); Rewrite(fo);

WriteLn(fo, F[n, M]);

while n <> 0 do

begin

if F[n, M] <> F[n - 1, M] then

begin

Write(fo, n, ' ');

M := M - W[n];

end;

Dec(n);

end;

Close(fo);

end;

begin

Enter;

Optimize;

Trace;

Page 120: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

121

end.

Bài toán 2: Chia thưởng

Cần chia hết m phần thưởng cho n học sinh sắp theo thứ tự từ giỏi trởxuống sao cho mỗi bạn không nhận ít phần thưởng hơn bạn xếp sau mình.

1 m, n 70.

Hãy tính số cách chia.

Thí dụ, với số phần thưởng m = 7, và số học sinh n = 4 sẽ có 11 cách chia 7

phần thưởng cho 4 học sinh theo yêu cầu của đầu bài. Đó là:

Phương án

1 7 0 0 0

2 6 1 0 0

3 5 2 0 0

4 5 1 1 0

5 4 3 0 0

6 4 2 1 0

7 3 3 1 0

8 3 2 2 0

9 4 1 1 1

10 3 2 1 1

11 2 2 2 1

Bài giải

Lập hệ thức

Page 121: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

122

Gọi Chia(i, j) là số cách chia i phần thưởng cho j học sinh, ta thấy:

Nếu không có học sinh nào (j = 0) thì không có cách chia nào (Chia = 0).

Nếu không có phần thưởng nào (i = 0) thì chỉ có một cách chia (Chia(0,j) = 1 -

mỗi học sinh nhận 0 phần thưởng). Ta cũng quy ước Chia(0, 0) = 1.

Nếu số phần thưởng ít hơn số học sinh (i < j) thì trong mọi phương án chia, từhọc sinh thứ i + 1 trở đi sẽ không được nhận phần thưởng nào:

Chia(i, j) = Chia(i, i) nếu i < j.

Ta xét tất cả các phương án chia trong trường hợp i j. Ta tách các phương ánchia thành hai nhóm không giao nhau dựa trên số phần thưởng mà học sinh đứng

cuối bảng thành tích, học sinh thứ j, được nhận:

Nhóm thứ nhất gồm các phương án trong đó học sinh thứ j không được nhận

thưởng, tức là i phần thưởng chỉ chia cho j - 1 học sinh và do đó, số cách chia,

tức là số phần tử của nhóm này sẽ là: Chia(i, j - 1).

Nhóm thứ hai gồm các phương án trong đó học sinh thứ j cũng được nhận

thưởng. Khi đó, do học sinh đứng cuối bảng thành tích được nhận thưởng thì

mọi học sinh khác cũng sẽ có thưởng. Do ai cũng được thưởng nên ta bớt của

mỗi người một phần thưởng (để họ lĩnh sau), số phần thưởng còn lại (i - j) sẽđược chia cho j học sinh. Số cách chia khi đó sẽ là Chia(i - j, j).

Tổng số cách chia cho trường hợp i j sẽ là tổng số phần tử của hai nhóm, ta có:

Chia(i, j) = Chia(i, j - 1) + Chia(i - j, j).

Tổng hợp lại ta có:

Điều kiện

i: số phần thưởng

j: số học sinh

Chia(i, j)

j = 0 Chia(i, j) = 0

i = 0 and j 0 Chia(i, j) = 1

Page 122: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

123

i < j Chia(i, j) = Chia(i, i)

i j Chia(i, j) = Chia(i, j – 1) + Chia(i – j, j)

Các tính chất của hàm Chia(i, j)

Chia i phần thưởng cho j học sinh

Tổ chức dữ liệu và chương trình

Ta có phương án đầu tiên của giải thuật Chia như sau:

Phương án đệ quy. Hàm Chia(i,j) tính số cách chia i phần thưởng cho j học sinh

function Chia(i,j: integer):longint;

begin

if j = 0 then Chia := 0

else {j > 0 }

if i = 0 then {i = 0; j > 0 }

Chia := 1

else {i,j > 0 }

if i < j then {0 < i < j }

Chia := Chia(i,i)

else {i >= j > 0 }

Chia := Chia(i,j-1)+Chia(i-j,j);

end;

Phương án này chạy chậm vì phát sinh ra quá nhiều lần gọi hàm trùng lặp. Bảng

dưới đây liệt kê số lần gọi hàm Chia khi giải bài toán chia thưởng với bảy phần

thưởng (m = 7) và 4 học sinh (n = 4). Thí dụ, hàm Chia(1,1) sẽ được gọi 9 lần,…Tổng số lần gọi hàm Chia là 79. 79 lần gọi hàm để sinh ra kết quả 11 là quá tốn

kém.

Page 123: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

124

0 9 1 1 0

9 9 2 1 0

6 6 1 0 0

5 5 2 1 1

3 3 1 1 0

2 2 1 0 0

1 1 0 0 0

1 1 1 1 1

Số lần gọi hàm Chia cục bộ

khi tính hàm Chia(7,4)

Làm tốt

Phương án 1 khá dễ triển khai nhưng chương trình sẽ chạy rất lâu. Diễn tả đệ quy

thường trong sáng, nhàn tản, nhưng khi thực hiện sẽ sinh ra hiện tượng gọi lặp lại

những hàm đệ quy. Cải tiến là tránh những lần gọi lặp như vậy. Muốn thế chúng ta

tính sẵn các giá trị của hàm theo các trị của đầu vào khác nhau và điền vào một

mảng hai chiều cc.

Mảng cc được mô tả như sau:

j - 1 j

i - j [i-j,j]

... ...

Page 124: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

125

const

MN = 70;{ gioi han tren cua m va n }

var cc: array[0..MN,0..MN] of longint;

Ta quy ước cc[i, j] chứa số cách chia i phần thưởng cho j học sinh.

Theo phân tích của phương án 1, ta có:

cc[0, 0] = 1; cc[i, 0] = 0, với i:=1..m.

cc[i, j] = cc[i, i], nếu i < j

cc[i, j] = cc[i, j-1]+cc[i-j, j], nếu i j.

Từ đó ta suy ra quy trình điền trị vào bảng cc như sau:

Khởi trị

cc[0,0 ]:= 1;

với i := 1..m: cc[i,0] := 0;

Điền bảng: Lần lượt điền theo từng cột j:= 1..n. Tại mỗi cột j ta đặt:

với i := 0..j-1: cc[i,j] := cc[i,i];

với i := j..m: cc[i,j] := cc[i,j-1]+cc[i-j,j];

Nhận kết quả: Sau khi điền bảng, giá trị cc[m, n] chính là kết quả cần tìm.

Phương án dùng mảng 2 chiều:

function Chia2(m,n: integer):longint;

var i,j: integer;

begin

cc[0,0] := 1;

for i := 1 to m do cc[i,0] := 0;

for j := 1 to n do

begin

for i := 0 to j-1 do cc[i,j] := cc[i,i];

for i := j to m do

i [i,j-1] [i,j]

Page 125: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

126

cc[i,j] := cc[i,j-1]+cc[i-j,j];

end;

Chia2 := cc[m,n];

end;

Bài toán 3: Phép nhân tổ hợp dãy ma trận

Với ma trận A={a[i, j]} kích thước p×q và ma trận B={b[i, j]} kích thước q×r.

Người ta có phép nhân hai ma trận đó để được ma trận C={c[i, j]} kích thước

p×r. Mỗi phần tử của ma trận C được tính theo công thức:

q

krjpijkbjiajiC

11,1],,[].,[,

Ví dụ:

A là ma trận kích thước 34, B là ma trận kích thước 45 thì C sẽ là ma trận

kích thước 35

33164412254

21100251434

9369614

11111

16103

15010

04201

1211109

8765

4321

Để thực hiện phép nhân hai ma trận A(p×q) và B(q×r) ta có thể làm như đoạn

chương trình sau:

for i := 1 to p do

for j := 1 to r do

begin

c[i, j] := 0;

for k := 1 to q do c[i, j] := c[i, j] + a[i, k] * b[k, j];

end;

Phí tổn để thực hiện phép nhân ma trận có thể đánh giá qua số lần thực hiện

phép nhân số học, với giải thuật nhân hai ma trận kể trên, để nhân ma trận A cấp

Page 126: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

127

pxq với ma trận B cấp qxr ta cần thực hiện p.q.r phép nhân số học. Phép nhân

ma trận không có tính chất giao hoán nhưng có tính chất kết hợp (A.B).C =

A.(B.C)

Vậy nếu A là ma trận cấp 3x4, B là ma trận cấp 4x10 và C là ma trận cấp 10x15

thì:

Để tính (A.B).C, phép tính (A.B) cho ma trận kích thước 3x10 sau 3.4.10=120

phép nhân số, sau đó nhân tiếp với C được ma trận kết quả kích thước 3x15 sau

3.10.15=450 phép nhân số. Vậy tổng số phép nhân số học phải thực hiện sẽ là

570.

Để tính A.(B.C), phép tính (B.C) cho ma trận kích thước 4x15 sau 4.10.15=600

phép nhân số, lấy A nhân với ma trận này được ma trận kết quả kích thước 3x15

sau 3.4.15=180 phép nhân số. Vậy tổng số phép nhân số học phải thực hiện sẽ là

780.

Vậy thì trình tự thực hiện có ảnh hưởng lớn tới chi phí. Vấn đề đặt ra là tính sốphí tổn ít nhất khi thực hiện phép nhân một dãy các ma trận:

n

i

nmmmim1

][]......2[].1[][

Với :

m[1] là ma trận kích thước a[1] x a[2]

m[2] là ma trận kích thước a[2] x a[3]

m[n] là ma trận kích thước a[n] x a[n+1]

Dữ liệu: file văn bản MULTMAT.INP

Dòng 1: Chứa số nguyên dương n ≤ 100

Dòng 2: Chứa n + 1 số nguyên dương a[1], a[2], …, a[n+1] (∀i: 1 ≤ a[i] ≤ 100)

cách nhau ít nhất một dấu cách

Kết quả: file văn bản MULTMAT.OUT

Dòng 1: Ghi số phép nhân số học tối thiểu cần thực hiện

Page 127: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

128

Dòng 2: Ghi biểu thức kết hợp tối ưu của phép nhân dãy ma trận

MULTMAT.INP MULTMAT.OUT

6

3 2 3 1 2 2 3

Number of numerical multiplications: 31

((m[1].(m[2].m[3])).((m[4].m[5]).m[6]))

Bài giải:

Trước hết, nếu dãy chỉ có một ma trận thì chi phí bằng 0, tiếp theo ta nhận thấy

chi phí để nhân một cặp ma trận có thể tính được ngay. Vậy có thể ghi nhận

được chi phí cho phép nhân hai ma trận liên tiếp bất kỳ trong dãy. Sử dụng

những thông tin đã ghi nhận để tối ưu hoá phí tổn nhân những bộ ba ma trận liên

tiếp … Cứ tiếp tục như vậy cho tới khi ta tính được phí tổn nhân n ma trận liên

tiếp.

Công thức truy hồi

Gọi f[i, j] là số phép nhân số học tối thiểu cần thực hiện để nhân đoạn ma trận

liên tiếp:

j

it

jmimimimtm ][]......2[].1[].[][

Thì khi đó f[i, i] = 0 với i.

Để tính

j

it

tm ][ có thể có nhiều cách kết hợp:

j

it

j

kv

k

iu

vmumtm1

][][][ kik : <j

Với một cách kết hợp (phụ thuộc vào cách chọn vị trí k), chi phí tối thiểu phải

thực hiện bằng: f[i, k] (là chi phí tối thiểu tính

k

iu

um ][ ) cộng với f[k+1, j] (là

Page 128: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

129

chi phí tối thiểu tính

j

kv

vm1

][ cộng với a[j].a[k+1].a[j+1] (là chi phí thực hiện

phép nhân cuối cùng giữa ma trận

k

iu

um ][ và ma trận

j

kv

vm1

][

Từ đó suy ra: do có nhiều cách kết hợp, mà ta cần chọn cách kết hợp để có chi

phí ít nhất nên ta sẽ cực tiểu hoá f[i, j] theo công thức:

])1[].1[].[],1[],[(min],[

jakaiajkfkifjifjki

Tính bảng phương án

Bảng phương án F là bảng hai chiều, nhìn vào công thức truy hồi, ta thấy f[i, j]

chỉ được tính khi mà f[i, k] cũng như f[k + 1, j] đều đã biết ( k: i ≤ k < j). Tức

là ban đầu ta điền cơ sở quy hoạch động vào đường chéo chính của bảng( i: f[i,

i] := 0), từ đó tính các giá trị thuộc đường chéo nằm phía trên (tính các f[i, i +

1]), rồi lại tính các giá trị thuộc đường chéo nằm phía trên nữa (các f[i, i + 2]) …Đến khi tính được f[1, n] thì dừng lại

Tìm cách kết hợp tối ưu

Tại mỗi bước tính f[i, j], ta ghi nhận lại Tr[i, j] là điểm k mà cách tính:

j

it

j

kv

k

iu

vmumtm1

][][][

cần số phép nhân số học ít nhất trên tất cả các cách chọn k. Sau đó, muốn in ra

phép kết hợp tối ưu để nhân

j

it

tm ][ , ta sẽ in ra cách kết hợp tối ưu để nhân

],[

][jitr

iu

um và cách kết hợp tối ưu để nhân

j

jitrv

vm1],[

][ (có kèm theo dấu đóng mở

ngoặc) đồng thời viết thêm dấu “.” vào giữa hai biểu thức đó.

program Matrix_Multiplications;

const

InputFile = 'MULTMAT.INP';

OutputFile = 'MULTMAT.OUT';

Page 129: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

130

max = 100;

var

a: array[1..max + 1] of Integer;

f: array[1..max, 1..max] of Integer;

tr: array[1..max, 1..max] of Integer;

n: Integer;

fo: Text;

procedure Enter;

var

i: Integer;

fi: Text;

begin

Assign(fi, InputFile); Reset(fi);

ReadLn(fi, n);

for i := 1 to n + 1 do Read(fi, a[i]);

Close(fi);

end;

procedure Optimize;

var

i, j, k, len: Integer;

x, p, q, r: Integer;

begin

for i := 1 to n do

for j := i to n do

if i = j then f[i, j] := 0

else f[i, j] := High(Integer);

Page 130: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

131

for len := 2 to n do

for i := 1 to n - len + 1 do

begin

j := i + len - 1;

for k := i to j - 1 do

begin

p := a[i];q:= a[k + 1]; r := a[j + 1];

x := f[i, k] + f[k + 1, j] + p * q * r;

if x < f[i, j] then

begin

f[i, j] := x;

tr[i, j] := k;

end;

end;

end;

end;

procedure Trace(i, j: Integer);

var

k: Integer;

begin

if i = j then Write(fo, 'm[', i, ']')

else

begin

Write(fo, '(');

k := tr[i, j];

Trace(i, k);

Page 131: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

132

Write(fo, '.');

Trace(k + 1, j);

Write(fo, ')');

end;

end;

begin

Enter;

Optimize;

Assign(fo, OutputFile); Rewrite(fo);

WriteLn(fo, 'Number of numerical multiplications: ', f[1, n]);

Trace(1, n);

Close(fo);

end.

Bài toán 4: Palindrome

Dãy kí tự s được gọi là đối xứng (palindrome) nếu các phần tử cách đều đầu và

cuối giống nhau. Cho dãy s tạo bởi n kí tự gồm các chữ cái hoa và thường phân

biệt và các chữ số. Hãy cho biết cần xoá đi từ s ít nhất là bao nhiêu kí tự để thu

được một dãy đối xứng. Giả thiết rằng sau khi xoá bớt một số kí tự từ s thì các kí

tự còn lại sẽ tự động xích lại sát nhau.

Dữ liệu vào ghi trong tệp văn bản PALIN.INP với cấu trúc như sau:

Dòng đầu tiên là giá trị n, 1 n 1000.

Dòng thứ hai là n kí tự của dãy viết liền nhau.

Kết quả ghi trong tệp văn bản PALIN.OUT: số lượng kí tự cần xóa.

PALIN.INP PALIN.OUT

9

baeadbadb

4

Page 132: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

133

Thí dụ, với dãy s gồm 9 kí tự, s = 'baeadbadb' thì cần xoá ít nhất 4 kí tự, chẳng

hạn, các kí tự thứ 5, 7, 8 và 9 sẽ thu được dãy đối xứng chiều dài 5 là baeab:

baeadbadb baeab

Dĩ nhiên là có nhiều cách xoá. Thí dụ, có thể xoá các kí tự thứ 2, 3, 4 và 6 từ dãy s

để thu được dãy con đối xứng khác là bdadb với cùng chiều dài 5:

baeadbadb bdadb

Tuy nhiên đáp số là số ít nhất các kí tự cần loại bỏ khỏi s thì là duy nhất và bằng

4.

Bài giải

Với một nhận xét nhỏ ta có thể phát hiện ra rằng chỉ cần dùng một mảng một

chiều kích thước n và một vài biến đơn là đủ.

Gọi dãy dữ liệu vào là s. Ta tìm chiều dài của dãy con đối xứng v dài nhất trích

từ s. Khi đó số kí tự cần xoá từ s sẽ là t = length(s) - length(v). Dãy con ở đâyđược hiểu là dãy thu được từ s bằng cách xoá đi một số phần tử trong s. Thí dụvới dãy s = baeadbadb thì dãy con đối xứng dài nhất của s sẽ là baeab hoặc

bdadb,… Các dãy này đều có chiều dài 5.

Lập hệ thức: Gọi p(i, j) là chiều dài của dãy con dài nhất thu được khi giải bài

toán với dữ liệu vào là đoạn s[i..j]. Khi đó p(1, n) là chiều dài của dãy con đối

xứng dài nhất trong dãy n kí tự s[1..n] và do đó số kí tự cần loại bỏ khỏi dãy

s[1..n] sẽ là

n-p(1,n)

Đó chính là đáp số của bài toán.

Ta liệt kê một số tính chất quan trọng của hàm hai biến p(i, j). Ta có:

Nếu i > j, tức là chỉ số đầu trái lớn hơn chỉ số đầu phải, ta quy ước đặt p(i, j) = 0.

Nếu i = j thì p(i, i) = 1 vì dãy khảo sát chỉ chứa đúng 1 kí tự nên nó là đối xứng.

Nếu i < j và s[i] = s[j] thì p(i, j) = p(i + 1, j – 1) + 2. Vì hai kí tự đầu và cuối dãy

s[i,j] giống nhau nên chỉ cần xác định chiều dài của dãy con đối xứng dài nhất

trong đoạn giữa là s[i + 1, j – 1] rồi cộng thêm 2 đơn vị ứng với hai kí tự đầu và

cuối dãy là được.

Page 133: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

134

Nếu i < j và s[i] s[j], tức là hai kí tự đầu và cuối của dãy con s[i..j] là khác

nhau thì ta khảo sát hai dãy con là s[i..(j – 1)] và s[(i + 1)..j] để lấy chiều dài của

dãy con đối xứng dài nhất trong hai dãy này làm kết quả:

p(i,j) = max(p(i,j-1),p(i+1,j))

Vấn đề đặt ra là cần tính p(1, n). Mà muốn tính được p(1, n) ta phải tính được

các p(i, j) với mọi i, j = 1..n.

Phương án đệ quy

Phương án đệ quy dưới đây như mô tả trong hàm nguyên rec(i, j) tính trực tiếp giá

trị p(i, j) theo các tính chất đã liệt kê. Đáp số cho bài toán khi đó sẽ là n-rec(1,n)

function rec(i,j: integer): integer;

begin

if i > j then rec := 0

else if i = j then rec := 1

else {i < j}

if s[i] = s[j]

then rec := rec(i+1,j-1)+2

else {i < j & s[i] s[j]}

rec := max(rec(i,j-1),rec(i+1,j));

end;

Dùng một mảng hai chiều

Gọi đệ quy sẽ phát sinh các lời gọi hàm trùng lặp. Khắc phục điều này bằng

cách sử dụng một mảng hai chiều để tính trước các giá trị của hàm p(i, j), mỗi

giá trị được tính tối đa một lần. Nếu dùng một mảng hai chiều, thí dụ mảng

p[0..n, 0..n] thì giá trị của p[i, j] sẽ được điền lần lượt theo từng cột, từ cột thứ 1

đến cột thứ n. Tại mỗi cột ta điền từ dưới lên trên. Ta lưu ý:

Phần tử tại cột i, dòng j là giá trị p[i, j] chính là chiều dài của dãy con đối xứng

dài nhất khi khảo sát dãy con s[i..j].

Page 134: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

135

Với các trị i > j, ta quy định p[i, j] = 0. Như vậy nửa tam giác dưới của ma trận p

sẽ chứa toàn 0.

Nếu i = j thì p[i, j] = 1. Như vậy, mọi trị trên đường chéo chính của ma trận p sẽlà 1.

Với các ô còn lại, toạ độ (i, j) sẽ thoả điều kiện i < j, nên p[i, j] sẽ được tính nhưsau:

if s[i] = s[j] then p[i,j] = p[i+1,j-1]+2

else p[i,j] := max(p[i,j-1],p[i+1,j]);

Ta thực hiện điền một vài giá trị cho bảng trên để rút ra quy luật.

Hãy bắt đầu với cột 1: p[1, 1] = 0;

Sau đó đến cột 2:

p[2, 2] = 1; p[1, 2] = max(p[1, 1], p[2, 2]) = 1, vì s[1] s[2].

Rồi đến cột 3:

p[3,3]=1; p[2,3] = max(p[2, 2], p[3, 3]) = 1, vì s[2] s[3];

p[1,3] = max(p[1,2], p[2,3]) = 1, vì s[1] s[3],…

Dùng hai mảng một chiều

Ta sẽ không theo đuổi phương án dùng mảng hai chiều mà hãy căn cứ vào quy

luật điền mảng hai chiều để vận dụng cho hai mảng một chiều là v[0..(n + 1)] và

d[0..(n + 1)]. Theo kinh nghiệm, ta nên khai báo kích thước mảng rộng hơnchừng hai phần tử để sử dụng các phần tử này như những lính canh chứa các giá

trị khởi đầu phục vụ cho các trường hợp chỉ số i, j nhận các giá trị 0 hoặc n + 1.

Giả sử mảng v chứa các giá trị đã điền của cột j – 1 trong mảng hai chiều p. Ta

sẽ điền các giá trị cho cột j của mảng p vào mảng một chiều d. Như vậy, tại

bước j, phần tử v[i] sẽ ứng với phần tử p[j – 1, i] còn phần tử d[i] sẽ ứng với p[j,

i]. Thủ tục điền trị cho cột d tại bước j dựa theo kết quả lưu trong cột v của bước

j – 1 khi đó sẽ như sau:

for i := j-1 downto 1 do

begin

Page 135: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

136

if s[i] = s[j] then d[i] := v[i+1]+2

else d[i] := max(v[i],d[i+1]);

end;

Sau mỗi lần lặp với j := 1..n ta chuyển giá trị của d cho v để chuẩn bị cho bước

tiếp theo.

procedure QHD;

var i,j: integer;

begin

fillchar(v,sizeof(v),0);

for j := 1 to n do

begin

d[j] := 1;

for i := j-1 downto 1 do

begin

if s[i]= s[j] then d[i] := v[i+1]+2

else d[i] := max(v[i],d[i+1]);

end;

v := d;

end;

writeln(nl,n-d[1]); {dap so}

end;

6. Một số bài tập

Bài 1: Xâu đối xứng

Tên chương trình: PALINDR.PAS

Palindrome là xâu ký tự mà nếu đọc nó từ trái sang phải cũng như từ phải

sang trái ta được cùng một xâu. Một xâu ký tự bất kỳ luôn có thể biểu diễn như

Page 136: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

137

là một dãy các palindrome nếu như ta coi xâu chỉ gồm một ký tự luôn là một

palindrome.

Ví dụ: Xâu ‘bobseesanna’ có thể biểu diễn dưới dạng dãy các palindrome theo

nhiều cách, chẳng hạn:

‘bobseesanna’ = ‘bob’ + ‘sees’ + ‘anna’

‘bobseesanna’ = ‘bob’ + ‘s’ + ‘ee’ + ’s’ + ‘anna’

‘bobseesanna’ = ‘b’ +’o’ + ‘b’ + ‘sees’ + ‘a’ + ‘n’ + ‘n’ + ‘a’

Yêu cầu: Cho xâu ký tự s, cần tìm cách biểu diễn xâu s dưới dạng một dãy

gồm số ít nhất các palindrome.

Dữ liệu: tệp văn bản PALINDR.INP, gồm một dòng chứa xâu ký tự s gồm

không quá 1000 ký tự.

Kết quả: tệp văn bản PALINDR.OUT một số nguyên dương k là số lượng ít

nhất các palindrome trong biểu diễn tìm được.

Ví dụ:

PALINDR.INP PALINDR.OUT

bobseesanna 3

Bài 2: Người thợ lặn

Tên chương trình: PROGMAN.PAS

Mỗi thợ lặn đều sử dụng trang thiết bị đặc biệt khi lặn. Có một xylanh với 2 bình

chứa: một chứa ôxy và một chứa Nitơ. Phụ thuộc vào thời gian lặn dưới nước và

độ sâu của việc lặn anh ấy dùng đến lượng oxy và nitơ khác nhau. Anh ta được

tuỳ ý sử dụng một số xylanh. Mỗi xylanh được miêu tả bởi trọng lượng và dung

tích mà nó chứa. Anh ấy biết trước việc lặn của mình cần bao nhiêu oxy và nitơ.

Yêu cầu: Bạn hãy tìm một hoặc một số xylanh có trọng lượng nhỏ nhất anh ấy

mang theo để hoàn thành việc lặn.

Page 137: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

138

Dữ liệu: tệp văn bản PROGMAN.INP

Dòng đầu là ghi 2 số nguyên: t, a (1<=t<=21, 1<=a<=79: t là dung tích oxy và a

là dung tích nitơ anh ta cần, dung tích tính theo lít)

Dòng 2 ghi số n nguyên dương (1<=n<=1000 là số xylanh)

n dòng sau, dòng thứ i+2 ghi 3 số nguyên ti, ai, wi, trong đó 1<=ti<=21,

1<=ai<=79, 1<=wi<=800 lần lượt là dung tích oxy, dung tích nitơ và trọng lượng

của bình thứ i)

Dữ liệu cho trên cùng hàng được ngăn cách nhau bởi ít nhất một dấu cách.

Kết quả: tệp văn bản PROGMAN.OUT

Ghi 1 số duy nhất là tổng trọng lượng các bình người thợ lặn cần mang theo đểhoàn thành việc lặn của anh ta.

Ví dụ:

PROGMAN.INP PROGMAN.OUT

5 60

5

3 36 120

10 25 129

5 50 250

1 45 130

4 20 119

249

Bài 3: Đường đi nhỏ nhất

Tên chương trình: DUONGDI.PAS

Cho hình chữ nhật gồm M dòng, N cột. Các dòng được đánh số từ 1 đến

M, các cột được đánh số từ 1 đến N. Trên mỗi ô đều có một số nguyên x (|x|

<32000). Hãy tìm đường đi từ ô (1,1) đến ô (M,N) sao cho tổng các số trong các

Page 138: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

139

ô trên đường đi là bé nhất. Biết rằng từ một ô bất kỳ chỉ có thể đi sang ô chungcạnh bên phải hoặc xuống dưới.

Dữ liệu: tệp văn bản DUONGDI.INP

Dòng đầu tiên chứ 2 số M, N

M dòng tiếp theo mỗi dòng chứa N số nguyên tương ứng với M dòng và N cột

của hình chữ nhật.

Kết quả: tệp văn bản DUONGDI.OUT

Chứa một số duy nhất là tổng các số trên đường đi cần tìm.

DUONGDI.INP DUONGDI.OUT

2 3

1 2 1

0 1 1

3

Page 139: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

140

Bài 4: Người buôn lậu

Tên chuơng trình: SMUGGLER.PAS

Byteotia là quốc gia giàu có nhờ vàng. Vì vậy, trong rất nhiều năm người dân

của nước này bán vàng qua nước láng giềng là Bitland. Thật không may mắn,

gần đây Bitland bị thâm hụt ngân sách. Vì vậy, Nhà vua của Bitland quyết định

đánh thuế rất nặng (50%) vào vàng và các khoáng sản khác mua từ nước

Byteotia.

Các nhà hoá học nước Byteotia vừa nghiên cứu ra các cách chuyển vàng thành

một số kim loại khác và do đó để chuyển được thì phải mất một lượng phí nhất

định cho 1 kg trọng lượng. Do đó các thương gia đưa ra ý tưởng chuyển vàng

thành một kim loại khác có giá trị nhỏ hơn (để giảm thuế) rồi chuyển qua biên

giới, sau khi tới Bitland thì chuyển ngược lại từ kim loại thành vàng để thu được

lợi nhuận cao nhất.

Yêu cầu: Bạn hãy viết chương trình giúp các thương gia Byteotia quyết định

chuyển vàng qua biên giới (thuế là 50% giá trị 1 kg vàng) hay đưa ra một trình

tự đổi từ vàng thành các kim loại và từ kim loại thành vàng với số tiền phải trảcộng thêm 50% giá trị kim loại có giá trị nhỏ nhất trong dãy biến đổi là nhỏ nhất

có thể.

Dữ liệu: tệp văn bản SMUGGLER.INP

N (số kim loại khác nhau, 1<=n<=5000)

P1

… 0<=Pi<=109, Pi nguyên, là giá 1kg kim loại thứ i,

Pn

M (0<=M<=100 000, M nguyên dương là số cách đổi khác nhau)

A1 b1 c1

……………..

Am bm cm

Page 140: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

141

(Ai bi ci nguyên dương, thể hiện kim lại thứ ai đổi lấy kim loại thứ bi với chi

phí ci, 1<=ai, bi<=n, 0<=ci<=10 000, mỗi cặp ai bi xuất hiện nhiều nhất 1 lần

trong file input)

Kết quả: tệp văn bản SMUGGLER.OUT

Ghi 1 số duy nhất là giá tiền ít nhất các thương gia Byteotia phải trả.

Ví dụ:

SMUGGLER.INP SMUGGLER.OUT

4

200

100

40

2

6

1 2 10

1 3 5

2 1 25

3 2 10

3 4 5

4 1 50

60

Bài 5: Cho thuê máy tính

Tên chuơng trình: RENT.PAS

Tại thời điểm 0, ông chủ thuê máy tính nhận đuợc đơn đặt hàng thuê sử dụng

máy tính của N khách hàng. Các khách hàng đuợc đánh số từ 1 đến N. Khách

hàng thứ i cần sử dụng máy tính từ thời điểm di đến thời điểm ci (di,ci là các sốnguyên duơng không quá 109) và sẽ trả tiền sử dụng máy là pi (pi nguyên duơng

Page 141: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

142

không quá 107). Hãy xác định xem ông chủ cần nhận phục vụ khách hàng nào

sao cho khoảng thời gian sử dụng máy của các khách hàng không giao nhau và

tổng tiền thu đuợc là lớn nhất.

Dữ liệu: tệp văn bản RENT.INP

Dòng đầu ghi số N (0<N1000)

Dòng thứ i trong N dòng kế tiếp, mỗi dòng ghi ba số di, ci, pi cách nhau bởi kí tựtrống.

Kết quả: tệp văn bản RENT.OUT

Dòng đầu ghi hai số nguyên là số luợng khách hàng đuợc phục vụ và tổng sốtiền thu đuợc

Dòng tiếp theo ghi chỉ số của các khách hàng đuợc phục vụ

RENT.INP RENT.OUT

3

150 500 150

1 200 100

400 800 80

2 180

2 3

4

400 821 800

200 513 500

100 325 200

600 900 600

2 1100

2 4

Page 142: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

143

TỔ CHỨC CÁC HOẠT ĐỘNG VỀ CNTT TRONG TRƯỜNG THPTCHUYÊN HẠ LONG TỈNH QUẢNG NINH

Nguyễn Hồng Thái, THPT Chuyên Hạ Long tỉnh Quảng Ninh

Trước hết về chuyển biến nhận thức, có thể nói phần lớn cán bộ, giáo viên

và học sinh đều đã sớm thấy rất rõ vai trò quan trọng và tác dụng to lớn của

CNTT trong thời đại ngày nay trên mọi lĩnh vực, trong đó có giáo dục và đàotạo. Bằng chứng hùng hồn nhất là sự hào hứng nhập cuộc với niềm say mê hiếm

thấy đối với bộ môn Tin học của đông đảo cán bộ, giáo viên và học sinh ở các

trường phổ thông. Vì thế, khi có sự ưu tiên tăng cường đầu tư trang thiết bịCNTT và cán bộ chuyên môn, sự chỉ đạo của cơ quan quản lý giáo dục các cấp,

hoạt động đào tạo, bồi dưỡng, tự học môn Tin học và triển khai ứng dụng CNTT

đã nhanh chóng lan rộng và trở thành nhu cầu không thể thiếu trong các cơ sởtrường học và cơ quan quản lý, chỉ đạo giáo dục trong toàn tỉnh.

Sau đây tôi xin trình bày tham luận của mình về “Tổ chức các hoạt động vềCNTT trong trường THPT Chuyên Hạ Long tỉnh Quảng Ninh”.

Về cơ sở hạ tầng: Trường THPT Chuyên Hạ Long vừa được tỉnh đầu tưxây dựng trên một cơ sở mới nên về cơ sở hạ tầng CNTT được trang bị rất đầy

đủ và hiện đại. Bên cạnh đó nhà trường cũng tăng cường đầu tư hạ tầng thiết bịCNTT phục vụ cho công tác dạy học và ứng dụng CNTT. Tất cả các phòng bộmôn đều được trang bị 01 bộ máy tính; Các phòng học đều được trang bị 01 bộmáy tính và máy chiếu. Trường có 02 phòng thực hành tin học, mỗi phòng 35

máy tính và 01 máy chiếu; 01 phòng tin học gồm 10 máy tính phục vụ cho việc

giảng dạy đội tuyển học sinh giỏi môn Tin học; 01 phòng công nghệ cao gồm 01

máy chủ, 20 máy tính, 01 máy quét, 01 máy in và 04 camera. Tất cả các máy

tính trong trường được kết nối thành một mạng LAN và được kết nối với

Internet.

Page 143: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

144

Về công tác quản lý: Nhà trường đã ứng dụng CNTT vào hầu hết các công

việc hành chính và đã đạt được hiệu quả cao. Nhà trường đã sử dụng một sốphần mềm vào một số công việc phức tạp như: xếp thời khóa biểu, tuyển sinh

vào lớp 10, quản lý thi tốt nghiệp THPT, hệ thống nhập điểm hàng tháng của

giáo viên, …

Nhà trường đã có trang web riêng để đăng tải các thông tin cần thiết.

Nhà trường đã triển khai và sử dụng hệ thống e-mail quản lý giáo dục có

tên miền [email protected] và hiện đang hoàn thiện phương thức trao

đổi công văn bằng thư điện tử.

Trong công tác tuyển dụng giáo viên, đã triển khai áp dụng việc kiểm tra

kiến thức và kĩ năng tối thiểu về CNTT bằng khả năng đáp ứng được yêu cầu

công việc thực tế, không theo hình thức kiểm tra việc có chứng chỉ tin học ứng

dụng.

Về công tác dạy và học: Nhà trường đã chủ động tổ chức các lớp bồi dưỡng

về CNTT cho giáo viên. Trong đó yêu cầu chuẩn tối thiểu về kiến thức và kỹnăng ứng dụng CNTT: các khái niệm cơ bản về CNTT; Sử dụng các phần mềm

văn phòng như soạn thảo văn bản, bảng tính điện tử, trình chiếu; sử dụng phần

mềm phòng chống virus; khai thác và sử dụng Internet (khai thác thông tin từdanh mục các website cơ bản, biết tham gia diễn đàn, có kĩ năng tìm kiếm thông

tin) và có địa chỉ e-mail riêng; Tổ chức hướng dẫn và tập huấn sử dụng phần

mềm hỗ trợ tạo bài giảng điện tử. Yêu cầu cao về kỹ năng sử dụng công cụ tạo

bài giảng điện tử; khai thác và sử dụng các phần mềm dạy từng môn học chuyên

biệt và các phần mềm thí nghiệm ảo;

Những năm học gần đây nhà trường đã tổ chức tập huấn cho giáo viên các

môn học triển khai việc tích hợp, lồng ghép việc sử dụng các công cụ CNTT vào

quá trình dạy các môn học của mình. Đặc biệt ở những môn có thế mạnh về ứng

dụng CNTT.

Trong các đợt thao giảng, giám định giáo viên giỏi nhà trường luôn yêu cầu

về ứng dụng CNTT trong giờ giảng.

Page 144: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

145

Nhà trường đã có phòng thư viện điện tử phục vụ việc giảng dạy của giáo

viên và học tập của học sinh.

Trên đây là báo cáo tham luận của tôi về một số hoạt động tiêu biểu vềcông nghệ thông tin trong trường THPT Chuyên Hạ Long. Tôi rất mong nhận

được sự quan tâm, góp ý của các đồng chí.

Page 145: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

146

DẠY HỌC CHUYÊN ĐỀ GIẢI THUẬT THAM LAM

ĐỖ THỊ THÙY DƯƠNGGiáo viên trường THPT chuyên Nguyễn Huệ Hà Nội

Giải thuật tham lam (tiếng Anh: Greedy algorithm) là một thuật toán giảiquyết một bài toán theo kiểu metaheuristic để tìm kiếm lựa chọn tối ưu địaphương ở mỗi bước đi với hy vọng tìm được tối ưu toàn cục. Chẳng hạn áp dụnggiải thuật tham lam với bài toán hành trình của người bán hàng ta có giải thuậtsau: "Ở mỗi bước hãy đi đến thành phố gần thành phố hiện tại nhất".

Nói chung, giải thuật tham lam có năm thành phần:1. Một tập hợp các ứng viên (candidate), để từ đó tạo ra lời giải2. Một hàm lựa chọn, để theo đó lựa chọn ứng viên tốt nhất để

bổ sung vào lời giải3. Một hàm khả thi (feasibility), dùng để quyết định nếu một

ứng viên có thể được dùng để xây dựng lời giải4. Một hàm mục tiêu, ấn định giá trị của lời giải hoặc một lời

giải chưa hoàn chỉnh5. Một hàm đánh giá, chỉ ra khi nào ta tìm ra một lời giải hoàn

chỉnh.Có hai thành phần quyết định nhất tới quyết định tham lam:Tính chất lựa chọn tham lamChúng ta có thể lựa chọn giải pháp nào được cho là tốt nhất ở thời điểm

hiện tại và sau đó giải bài toán con nảy sinh từ việc thực hiện lựa chọn vừa rồi.Lựa chọn của thuật toán tham lam có thể phụ thuộc vào các lựa chọn trước đó.Nhưng nó không thể phụ thuộc vào một lựa chọn nào trong tương lai hay phụthuộc vào lời giải của các bài toán con. Thuật toán tiến triển theo kiểu thực hiệncác chọn lựa theo một vòng lặp, cùng lúc đó thu nhỏ bài toán đã cho về một bài

toán con nhỏ hơn. Đấy là khác biệt giữa thuật toán này và giải thuật quy hoạchđộng. Giải thuật quy hoạch động duyệt hết và luôn đảm bảo tìm thấy lời giải.Tại mỗi bước của thuật toán, quy hoạch động đưa ra quyết định dựa trên các

quyết định của bước trước, và có thể xét lại đường đi của bước trước hướng tớilời giải. Giải thuật tham lam quyết định sớm và thay đổi đường đi thuật toán

Page 146: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

147

theo quyết định đó, và không bao giờ xét lại các quyết định cũ. Đối với một sốbài toán, đây có thể là một thuật toán không chính xác.

Cấu trúc con tối ưuMột bài toán được gọi là "có cấu trúc tối ưu", nếu một lời giải tối ưu của

bài toán con chứa lời giải tối ưu của bài toán lớn hơn.

DẠNG CÁC BÀI TOÁN GIẢI BẰNG GIẢI THUẬT THAM LAM

Giả sử ta phải chọn một tập con R của các phần tử cảu một tập

S = (s1, s2, …, sn)sao cho tập R thỏa mãn một điều kiện ràng buộc W(R) nào đó, và một hàm

mục tiêu Z(R) đạt giá trị tối ưu.Sơ đồ chung để giải các bài toán bằng giải thuật tham lamBước 1: Chọn một phần tử s có lợi nhất cho lời giải trong bước đó sao cho

phần tử này cùng với lời giải tối ưu của bài toán với tập con S – {s} với ràng

buộc W(R-{s}) là lời giải tối ưu cho bài toán.Bước 2: Tiếp tục tìm phần tử tiếp theo có lợi nhất với tập con S = S – {s}

với ràng buộc W = W(R – {s} và hàm mục tiêu Z = Z(R – {s}). Cho đến khikhông tìm được phần tử như vậy hoặc tập S = ∅.

BÀI TOÁN LỰA CHỌN CÔNG VIỆCBài toán

Giả sử rằng ta có một tập S = {1, 2, …, n} của n công việc sử dụng cùng

một tài nguyên, ví dụ như một phòng họp, tại một thời điểm chỉ có một côngviệc được tiến hành. Các công việc i được bắt đầu tại thời điểm si và kết thúc tạithời điểm fi với si ≤ fi. Nếu được chọn, công việc i sẽ chiếm khoảng thời gian là[si, fi).

Hãy lựa chọn công việc không mâu thuẫn nhau (nghĩa là các khoảng thờigian sử dụng tài nguyên không giao nhau) sao cho số các công việc được chọn lànhiều nhất.

Tính chất lời giảiGiả sử dãy công việc sắp xếp tăng dần theo thời điểm kết thúc:

f1 ≤fi ≤ … ≤ fn

1. Luôn tồn tại một lời giải tối ưu chứa công việc thứ nhất.

Page 147: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

148

2. Nếu A S là lời giải tối ưu của bài toán có chứa công việc 1thì A – {1} là lời giải tối ưu của bài toán với tập S’ gồm các công việc từthời điểm f1 trở đi.

Giải thuật tham lam giải bài toán lựa chọn công việcProcedure Greedy_Selector(s,f)

1. Sắp xếp tăng dần theo thời gian kết thúc các công việc:f[1] ≤ f[2] ≤ … ≤ f[n]

2. A := {1}

K := 1;

For I := 2 to n do

If si ≥ fk then

Begin

A := A {i};

K := I;

End;

Return A

BÀI TOÁN CÁI BA LÔ

Cho một cái ba lô có thể đựng một trọng lượng W và n loại đồ vật, đồ vậtthứ i có trọng lượng gi và giá trị vi. Tất cả các loại đồ vật đều có số lượng khônghạn chế. Tìm một cách lựa chọn các đồ vật đựng vào ba lô (chọn các loại đồ vậtnào, mỗi loại lấy bao nhiêu) sao cho tổng trọng lượng không vượt quá W và

tổng giá trị là lớn nhất.Theo yêu cầu của bài toán thì ta cần những đồ vật có giá trị cao mà trọng

lượng lại nhỏ để sao cho có thể mang được nhiều “đồ quý”, sẽ là hợp lý khi taquan tâm đến yếu tố “đơn giá” của từng loại đồ vật tức là tỷ lệ giá trị/trọnglượng. Đơn giá càng cao thì đồ càng quý.

Từ đó ta có kỹ thuật Tham lam áp dụng cho bài toán này là:

1. Tính đơn giá cho các loại đồ vật.2. Xét các loại đồ vật theo thứ tự đơn giá từ lớn đến nhỏ.3. Với mỗi đồ vật được xét sẽ lấy một số lượng tối đa mà trọng

lượng còn lại của ba lô cho phép.

Page 148: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

149

4. Xác định trọng luợng còn lại của ba lô và quay lại bước 3 chođến khi không còn có thể chọn được đồ vật nào nữa.

Ví dụ: Ta có một ba lô có trọng lượng là 37 và 4 loại đồ vật với trọng lượngvà giá trị tương ứng được cho trong bảng (hình 1)

Loạiđồ vật

Trọnglượng

Gi

á trịB 10 25

A 15 30

D 4 6

C 2 2

Hình 1

Từ bảng đã cho ta tính đơn giá cho các loại đồ vật và sắp xếp các loại đồvật này theo thứ tự đơn giá giảm dần ta có bảng (hình 2).

Loạiđồ vật

Trọnglượng

Gi

á trịĐơ

n giá

B 10 25 2.5

A 15 30 2.0

D 4 6 1.5

C 2 2 1.0

Hình 2

Theo đó thì thứ tự ưu tiên để chọn đồ vật là là B, A, D và cuối cùng là C.

Vật B được xét đầu tiên và ta chọn tối đa 3 cái vì mỗi cái vì trọng lượngmỗi cái là 10 và ba lô có trọng lượng 37. Sau khi đã chọn 3 vât loại B, trọnglượng còn lại trong ba lô là 37 - 3*10 = 7. Ta xét đến vật A, vì A có trọng lượng15 mà trọng lượng còn lại của balô chỉ còn 7 nên không thể chọn vật A. Xét vậtD và ta thấy có thể chọn 1 vật D, khi đó trọng lượng còn lại của ba lô là 7-4 = 3.

Cuối cùng ta chọn được một vật C.Như vậy chúng ta đã chọn 3 cái loại B, một cái loại D và 1 cái loại C. Tổng

trọng lương là 3*10 + 1*4 + 1*2 = 36 và tổng giá trị là 3*25+1*6+1*2 = 83.

Ta có thể thực hiện cài đặt bằng các thủ tục như sau:1. Tính đơn giá của các sản phẩm.

Page 149: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

150

struct DoVat{

char Ten [20];

float TrongLuong, GiaTri, DonGia;

int PhuongAn;//so luong do vat chon

};

2. Tính đơn giá của các sản phẩm.void TinhDonGia(DoVat sp[], int n)

{

for(int i = 1; i <= n; i++)

sp[i].DonGia = sp[i].GiaTri / sp[i].TrongLuong;

}

Độ phức tạp thuật toán là O(n)

3. Sắp xếp giảm dần theo đơn giávoid SapXep(DoVat sp[], int n)

{

for(int i = 1; i <= n - 1; i++)

for(int j = i + 1; j <= n; j++)

if (sp[i].DonGia < sp[j].DonGia)

swap(sp[i], sp[j]);

}

Độ phức tạp thuật toán O(n2)

4. Xác định sản phẩm cần lấyvoid Greedy(DoVat sp[], int n, float W)

{

for (int i = 0; i < n; i++) {

sp[i].PhuongAn = W / sp[i].TrongLuong;

W -= sp[i].PhuongAn * sp[i].TrongLuong;

}}

Độ phức tạp thuật toán là O(n)

Chú ý: Có một số biến thể của bài toán cái ba lô như sau:1. Mỗi đồ vật i chỉ có một số lượng si. Với bài toán này khi lựa

chọn vật i ta không được lấy một số lượng vượt quá si.

Page 150: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

151

2. Mỗi đồ vật chỉ có một cái. Với bài toán này thì với mỗi đồ vật ta

chỉ có thể chọn hoặc không chọn.

Page 151: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

152

DẠY HỌC CHUYÊN ĐỀ DUYỆT TOÀN BỘ VÀ NÂNG CAO

Lê Thanh BìnhTrường THPT Chuyên Nguyễn Trãi - Hải Dương

Trong việc lập trình cho máy tính, phương pháp duyệt toàn bộ các cấu hìnhđể tìm phương án tối ưu hay đếm số lượng các cấu hình thỏa mãn một điều kiệnnào đó, là một trong những phương pháp quan trọng. Có thể nói duyệt toàn bộ làphương án lập trình đầu tiên mà mọi học sinh khi bắt đầu học lập trình đều làmquen và phương pháp này là nét đặc trưng riêng của tin học so với cách tiếp cậnthường dùng trong toán học.

Duyệt toàn bộ là phương pháp liệt kê tất cả các phần tử của một tập hợp Dhữu hạn nào đó, từ đó hoặc là chỉ ra 1 phần tử thỏa mãn một tiêu chí tối ưu hoặclà đếm số lượng các phần tử thỏa mãn điều kiện nào đó. Cách tư duy này xuấtphát từ việc tập hợp D là hữu hạn và tận dụng tốc độ tính toán nhanh của máytính (mà tốc độ này luôn tăng trưởng theo cấp số nhân). Có thể nói, đây là cáchtư duy đơn giản, rất dễ viết chương trình. Tuy nhiên, có thể thấy rằng phươngpháp này có hạn chế rất khi số lượng các phần tử của tập hợp D lớn. Nó thể hiệnở chỗ thời gian tính toán để cho ra kết quả thường không chấp nhận được, ngaycả trong trường hợp có các máy tính đủ mạnh.

Do đó, trong phương pháp duyệt toàn bộ, ngoài việc tổ chức liệt kê cácphần tử sao cho đảm bảo duyệt qua hết mọi phần tử, cần phải bổ sung cácphương pháp cho phép bỏ qua hoặc gộp một số phần tử. Điều này cải thiện rấtđáng kể thời gian thực hiện của các chương trình. Thậm chí trong nhiều trườnghợp chúng ta thu được các chương trình rất hiệu quả.

Dạy học sinh cách duyệt toàn bộ một cách có hiệu quả, theo tôi, là một quátrình bền bỉ và lâu dài. Nó được bắt đầu ngay từ khi học sinh viết những dòngchương trình đầu tiên và cho đến khi được trang bị những cấu trúc dữ liệu phứctạp nhất, các em vẫn cảm thấy là chưa đủ.

Trong bài tham luận này, tôi xin nêu một số kinh nghiệm tổ chức dạy họccho học sinh khi học về phương pháp duyệt toàn bộ cũng như các cải tiến củaphương pháp này trong lập trình. Bản tham luận có ý đồ hệ thống lại các phươngpháp duyệt toàn bộ khác nhau cũng như các cách cải tiến thường gặp trong cácphương pháp. Đây là một tham vọng lớn được viết trong một bài viết nhỏ nên

Page 152: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

153

chắc chắn còn nhiều điểm thiếu sót, chưa hoàn chỉnh. Rất mong được sự góp ýcủa các đồng nghiệp.

Các ví dụ nêu ra trong bàn tham luận này được lấy từ các kỳ thi học sinhgiỏi Quốc gia và được lấy từ các tài liệu tham khảo. Nó không phải là hệ thốngcác bài tập xây dựng để dạy chuyên đề này. Mục đích của tôi là thông qua các vídụ này, tổng kết một số kỹ thuật cơ bản hay sử dụng trong phương pháp duyệttoàn bộ

A. DUYỆT TOÀN BỘ BẰNG CÁCH SỬ DỤNG CÁC VÒNG LẶP LÔNGNHAU

Nhóm bài toán sử dụng phương pháp duyệt toàn bộ đầu tiên là nhóm cácbài toán liệt kê bằng cách sử dụng các vòng lặp lồng nhau. Bài toán cơ bản thuộcloại này có thể phát biểu như sau:

Cho k là một hằng số (không phụ thuộc vào dữ liệu). Hãy liệt kê tất cả cácbộ iik Dxxxx ,....,, 21 . Ở đây Di là một tập hợp hữu hạn các phẩn tử nào đó.

Để liệt kê các dãy này, thông thường, chúng ta sẽ sử dụng k vòng lặp lồngnhau dạng:

for x1 D1do

for x2 D2 do

......

for xk Dk do...

Nếu như lực lượng mỗi tập Di là O(n) thì thời gian thực hiện việc liệt kêtoàn bộ theo cách trên là nk. Đây là con số khá lớn nếu như k, n lớn. Chính vìvậy cần phải có các kỹ thuật cải tiến để giảm thời gian thực hiện. Không có mộtnguyên tắc chung nào để làm điều này cả. Chúng ta xét một số ví dụ minh họacác kỹ thuật thường gặp.

Ví dụ 1: (VOI 2008) Cho hai dãy số nguyên a1, a2, ..., an và b1, b2, ..., bm. Hãy

tìm giá trị nhỏ nhất của ji ba với 1≤ i ≤n, 1≤ j ≤ m.

Phương pháp để giải quyết bài toán này là duyệt toàn bộ các cặp (i,j) (có

thể thấy có n x m cặp như vậy) để tìm ra cặp có ji ba nhỏ nhất:

Page 153: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

154

for i:=1 to n do

for j:=1 to m do

if abs(a[i]+b[j])<ds then ds:=abs(a[i]+b[j]);

Thuật toán có độ phức tạp O(mn) và với n, m lớn (khoảng 100000) thì cáchduyệt toàn bộ như trên không có hiệu quả. Để cải tiến đoạn mã chương trình trênchúng ta phải tìm cách khử vòng lặp trong. Cách thường làm là phải phân tích ýnghĩa của vòng lặp trong khi cố định chỉ số của vòng lặp ngoài.

Nhận xét rằng nếu i cố định thì ji ba đạt giá trị nhỏ nhất khi bj gần -ai

nhất. Do vậy vòng lặp trong (for j..) thực chất chỉ là tìm chỉ số j sao cho bj gần -ai nhất. Điều này dẫn đến việc rằng nếu mảng b1, b2, ..., bm được sắp xếp (tănghoặc giảm dần) Thì việc tìm chỉ số j như trên có thể thực hiện hiệu quả bằngcách tìm kiếm nhị phân. Do đó, bằng cách sắp xếp trước mảng b1, ..., bm (mấtO(mlogm)) ta giảm vòng lặp trong từ O(m) xuống còn O(logm).

Ví dụ 2: (Dựa theo VOI 2011) Cho ma trận m hàng, n cột với giá trị trong các ôthuộc tập {1,2,3,4} đếm xem có bao nhiêu ma trận con của ma trận nói trên cógiá trị ở bốn góc khác nhau.

Phương pháp giải bài toán này cũng là duyệt toàn bộ. Thử tất cả các matrận (i1,j1,i2,j2) là ma trận con của ma trận đã cho.

for i1:=1 to m do

for j1:=1 to n do

for i2:=i1+1 to m do

for j2:=j1+1 to n do

if (bốn góc khác nhau) then inc(ds);

Để cải tiến ta viết lại các vòng lặp trên thành:

for i1:=1 to m do

for i2:=i1+1 to m do

for j1:=1 to n do

for j2:=j1+1 to n do

Page 154: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

155

if (bốn góc khác nhau) then inc(ds);

Nguyên tắc cải tiến vẫn như trong ví dụ 1. Chúng ta cố định 3 vòng lặp ngoài.Có thể thấy lúc đó góc trên-trái và dưới-trái của ma trận con là cố định, Do đógiá trị ở các góc này là đã biết. Từ đây suy ra rằng vòng lặp thứ tư chẳng qua làđếm xem có bao nhiêu vị trí mà ở đó giá trị của góc phải-trên và phải-dưới cùngvới hai giá trị đã biết lập thành 4 số khác nhau. Chúng ta có thể thực hiện điềunày trong O(1) bằng cách viết for j2:=n downto j1+1 do.. và sử dụng một mảngnhớ mem[1..4,1..4] of longint; với ý nghĩa mem[u,v] là số lượng cặp góc phải-trên và phải-dưới có giá trị (u,v).

Có thể tổng kết việc cải tiến thuật toán duyệt toàn bộ trong trường hợpnhiều vòng lặp lồng nhau là việc phân tích ý nghĩa của các vòng lặp bên trongkhi cố định các vòng lặp bên ngoài. Từ đó, bằng cách sử dụng các cấu trúc dữliệu thích hợp (như ở trên là mảng được sắp và mảng nhớ) ta có thể bỏ các vònglặp trong cùng và qua đó cải thiện được tốc độ của thuật toán.

Nếu như thông tin cần sử dụng lấy trong một tập hợp cố định cho trước thìmảng sắp xếp thường là lựa chọn hợp lý. Trường hợp thông tin là một giátrị đã xuất hiện thì mảng nhớ là giải pháp được chọn lựa.

Ta xét qua một số ví dụ tiếp theo

Ví dụ 3: Cho dãy a1, a2, ..., an hãy đếm xem có bao nhiêu dãy con ai, ai+1, ..., aj

có tổng bằng P cho trước.

Bằng cách đặt si=a1+a2+...ai. Ta có phương án duyệt toàn bộ các cặp dãycon mô tả bởi (i,j) như sau:

for j:=1 to n do

for i:=1 to j-1 do

if s[j]-s[i-1]=P then inc(ds);

Bây giờ ta cố định vòng lặp bên ngoài (for j...) khi đó từ s[j]-s[i-1]=P rút ras[i-1]=s[j]-P. Như vậy vòng lặp bên trong thực chất là đếm xem có bao nhiêu giátrị s[j]-P đã xuất hiện trước đó. Tất nhiên trong trường hợp này, một mảng nhớlà phương pháp được chọn lựa. Có một điểm cần chú ý ở đây là nếu miền giá trịcủa s[j]-P lớn thì cần phải sử dụng kỹ thuật băm (hashing) hoặc đơn giản hơn là

Page 155: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

156

ánh xạ tập {s[0], ..., s[n], s[0]-P,...,s[n]-P} vào tập số nguyên {0,...2n+1} sao chobảo toàn quan hệ thứ tự (kỹ thuật rời rạc hóa) để nhớ.

Ví dụ 4: Cho 3 dãy số A=(a1, a2, ..., ap); B=(b1, b2, ..., bq) và C=(c1, c2, ..., cr)nguyên dương. Hãy đếm xem có bao nhiêu tam giác được tạo thành với số đođược chọn từ A, B, C mỗi tập hợp một giá trị?

Phép duyệt toàn bộ cần 3 vòng lặp lồng nhau. Tuy nhiên, nếu giả thiết cạnhchọn từ C là cạnh lớn nhất thì khi cạnh chọn từ A , B cố định thì vòng lặp quatập hợp C thực chất là đếm xem có bao nhiêu giá trị thuộc khoảng [max(ai,bj)+1, ai+bj-1] và ta có thể tăng tốc bằng cách sắp xếp C tăng dần kết hợp vớitìm kiếm nhị phân.

Trong một số trường hợp, việc loại bỏ vòng lặp trong cần phải có các cấutrúc dữ liệu phức tạp hơn.

Ví dụ 5: Cho n robot quét sơn, robot thứ i quét một mảng tường độ rộng 1 đơnvị và độ cao hi (nguyên, dương). Các vệt quét là liền nhau theo thứ tự 1, 2, ...n.Hãy tìm một hình vuông trên tường đã được quét sơn có diện tích lớn nhất.

Nhận xét rằng luôn có hình vuông có diện tích lớn nhất mà cạnh đáy trùngvới mặt đất. Thuật toán O(n2) để giải bài toán này là thử tất cả các hình vuôngnhư vậy:

for j:=1 to n do

for i:=j downto 1 do

if min{h[i],...,h[j]}>=j-i+1 then

if canh<j-i+1 then canh:=j-i+1;

Ở đây canh là độ dài cạnh hình vuông cần tìm.

Việc khử vòng lặp trong trong trường hợp này phức tạp hơn các trường hợptrước đây. Giả sử với j ta đã tìm được hình vuông lớn nhất mép phải tại j có độdài cạnh là a khi đó, nếu xét đến vị trí j+1 các trường hợp sau dễ thấy:

+Nếu h[j+1]<=a thì cạnh của hình vuông lớn nhất mép phải j+1 là h[j+1]

+Nếu h[j+1]>a thì cạnh của hình vuông lớn nhất mép phải j+1 sẽ là a+1 nếu nhưmin{h[j-a+1], ...., h[j], h[j+1]}>=a+1

Page 156: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

157

Đặt b=min{a,h[j+1]}. Nhận xét rằng khi ở j ta phải tìm giá trị nhỏ nhất củamảng h trên đoạn [j-a+1,j] còn khi xét đến j+1 ta phải tìm giá trị nhỏ nhất củamảng h trên đoạn [j+1-b+1,j+1]. Do vậy có thể sử dụng hai cấu trúc sau:

+Cấu trúc Interval Tree để tim min trên một đoạn

+Do j+1-b+1>=j-a+1 nên có thể sử dụng một hàng đợi kép để tính các giá trịnhỏ nhất.

Như vậy, các kỹ thuật tăng tốc giải thuật duyệt toàn bộ trong trường hợpcác vòng lặp lồng nhau sẽ luôn được cập nhật khi học sinh học các cấu trúc dữliệu mới. Điều này là hợp lý vì về thực chất, các cấu trúc dữ liệu được sinh ra làđẻ phục vụ việc cải thiện việc lưu trữ cũng như cải thiện tốc độ của các thuậttoán đã có.

B. DUYỆT QUAY LUI

Trong trường hợp cần liệt kê tất cả các dãy (x1, x2, .., xn) ở đây n là biến phụthuộc dữ liệu thì thay cho các vòng lặp lồng nhau, người ta sử dụng phươngpháp duyệt quay lui. Các bài tập duyệt quay lui cơ bản như liệt kê các dãy nhịphân, liệt kê các tổ hợp chập, chỉnh hợp không lặp là các bài tập cần cho tất cảcác học sinh thành thạo.

Khi n tăng, số lượng cấu hình tăng theo cấp số lũy thừa. Do vậy, việc duyệtquay lui không cải tiến, ngoại trừ trong các trường hợp n rất nhỏ, thường là rấtkhông hiệu quả.

Một điểm cũng cần lưu ý, các phương pháp cải tiến trên cơ sở phép duyệtquay lui thực tế không cải thiện tốc độ trong tất cả các trường hợp mà thườngvẫn có những trường hợp những cải tiến này tỏ ra không hiệu quả.

1. Duyệt quay lui kết họp "chia đôi"

Tư tưởng của cách cải tiến này nằm ở việc có 2n dãy nhị phân khác nhau cóđộ dài n. Do đó nếu n nhỏ (≤17 chẳng hạn) thì cách duyệt toàn bộ là hiệu quả.Trong trường hợp n lớn hơn (nhưng không quá 34 chẳng hạn) thì việc duyệt trựctiếp tất cả các cấu hình chắc chắn không thực hiện được. Thay vào đó, ta chiatập hợp {x1, ..., xn} thành hai phần, mỗi phần có n/2 giá trị. Khi đó với mỗi phầnta có thể tiến hành duyệt toàn bộ riêng rẽ cuối cùng tìm cách tổ hợp kết quả củahai phần duyệt này với nhau thông qua các mảng nhớ.

Page 157: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

158

Ví dụ 6: Cho dãy a1, a2, ..., an (n≤34) và số S. Hỏi rằng có bao nhiêu cách phântích S thành tổng các số trong dãy nói trên. Trong một cách phân tích mỗi sốdùng không quá 1 lần.

Đặt (x1, x2, ..., xn) là dãy nhị phân độ dài n với ý nghĩa xi=1 nếu ai tham giavào phân tích số S, trường hợp ngược lại xi=0. Khi dó bài toán qui về đếm xemcó bao nhiêu dãy nhị phân (x1, x2, ..., xn) thỏa mãn a1x1+...+anxn=S?.

Chia dãy (x1, x2, ..., xn) thành hai dãy (x1, ..., xn/2) và (xn/2+1,...,xn). Trước tiênta liệt kê tất cả các dãy (x1, ..., xn/2) và với mỗi dãy tính tổng a1x1+...an/2xn/2. Giảsử mảng F[1], ..., F[p] lưu các tổng này.

Tương tự đối với nửa còn lại ta được mảng tổng G[1], ..., G[q].

Bài toán qui về là đếm xem trong mảng F, G có bao nhiêu giá trị bằng S vàcó bao nhiêu cặp (i,j) thỏa mãn F[i]+G[j]=S. Sử dụng kỹ thuật sắp xếp kết hợpvới tìm kiếm nhị phân đã trình bày trong phần A ta có thể giải quyết trọn vẹn bàitoán này.

2. Duyệt trong trường hợp có nhiều ràng buộc giữa các thành phần.

Bộ (x1, x2, ..., xn) có thể xem là một bộ gồm n ẩn. Nếu như ta biết m ràngbuộc giữa các ẩn này thì:

+ Nếu m<n chúng ta có n-m ẩn tự do, các ẩn khác có thể tính qua được các ẩnnày. Do vậy thay vì duyệt n ẩn ta chỉ cần duyệt n-m ẩn.

+Nếu m>=n thì giá trị hợp lệ của các ẩn (nếu có) thường là duy nhất và việcduyệt các bộ (x1, ..., xn) có thể được thay thế bằng việc giải một hệ phương trình.

Ta xét một số ví dụ sau:

Ví dụ 7: Có n bóng đèn và n công tắc. Mảng vuông a[i,j] có giá trị thuộc tập{0,1} với ý nghĩa a[i,j]=1 nếu bấm công tắc j bóng đèn i sẽ đổi trạng thái(bật/tắt). Cho trước trạng thái của n bóng đèn. Hãy tìm dãy công tắc ít nhất cầnbấm để tất cả các bóng đèn đều sáng.

Hiển nhiên mỗi công tắc chỉ bấm tối đa 1 lần (hoặc không bấm). Nên ta gọi(x1, ..., xn) là dãy nhị phân mô tả việc bấm công tắc. Giả sử bi=0/1 tùy thuộc vàođèn i đang sáng/tắt. Ta có hệ phương trình sau:

Page 158: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

159

)2](mod[][],[...]2[]2,[]1[]1,[

....

)2](mod2[][],2[...]2[]2,2[]1[]1,2[

)2](mod1[][],1[...]2[]2,1[]1[]1,1[

nbnxnnaxnaxna

bnxnaxaxa

bnxnaxaxa

Bằng cách cộng các phương trình theo phương pháp khử Gauss ta luôn đưahệ phương trình trên về dạng đường chéo:

)2](mod[][],[

....................

)2](mod2[][],2[.....]2[]2,2[

)2](mod1[][],1[...]2[]2,1[]1[]1,1[

ndnxnnc

dnxncxc

dnxncxcxc

Để giải hệ phương trình trên ta có thể viết một thủ tục duyệt quay lui tínhtừ x[n] ngược về x[1] (phải sử dụng duyệt quay lui vì sẽ có trường hợp c[k,k]=0khi đó x[k] có thể nhận hai giá trị hợp lệ 0,1)

Trong một số trường hợp, việc thay đổi thứ tự duyệt khi có nhiều ràng buộc giữacác thành phần cho phép ta chặt rất nhiều nhánh (phép duyệt trở thành gần tuyếntính).

Ví dụ 8: (Dò mìn) Cho biết a[i,j] là số lượng ô có mìn xung quanh ô (i,j) trongtrò chơi dò mìn trên windows. Hãy tìm các ô có mìn.

Đặt x[i,j]=1 nếu (i,j) có mìn và x[i,j]=0 nếu (i,j) không có mìn. Ta có ràng buộcsau trên tất cả các ô (i,j):

x[i-1,j-1]+x[i-1,j]+x[i-1,j+1]+x[i,j-1]+

x[i,j+1]+x[i+1,j-1]+x[i+1,j]+x[i+1,j+1]=a[i,j] (*)

Nếu bãi mìn có kích thước n x n thì ta có hệ n2 phương trình và n2 ẩn. Vềnguyên tắc có thể giải hệ phương trình để tìm ẩn. Tuy nhiên nếu để ý ta thấyrằng chỉ cần biết các giá trị của mảng x ở hàng đầu và cột đầu là có thể tínhđược các giá trị còn lại. Do vậy ta có thể thực hiện duyệt hàng đầu, cột đầu đểtìm nghiệm.

Nếu duyệt hết hàng rồi mới đến côt (hoặc ngược lại) thì phải xong 1 hàngta mới tính được các giá trị còn lại. Tuy nhiên bằng cach duyệt theo trật tự (1,1),(1,2), (2,1), (1,3), (3,1) ,...., (1,n), (n,1) ta có thể vừa kết hợp duyệt vừa kết hợp

Page 159: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

160

tính các giá trị còn lại trên cơ sở đó, nếu giá trị được tính khác 0,1 ta có thể tiếnhành quay lui ngay. Điều này làm cho thuật toán duyệt hoạt động rất hiệu quả.

3. Duyệt sử dụng nhánh cận

Phương pháp này dựa trên tư tưởng là khi biết (x1, ..., xk) ta chia hàm mụctiêu thành hai thành phần, thành phần thứ nhất phụ thuộc vào (x1,..., xk) cònthành phần thứ hai phụ thuộc vào (xk+1, ..., xn). Sử dụng một công thức đơn giảnđể ước lượng thành phần thứ hai, trên cơ sở đó có quyết định nên tiếp tục duyệthay quay lui.

Phương pháp trên được mô tả khá chi tiết trong quyển "cấu trúc dữ liệu vàgiải thuật" của TS Lê Minh Hoàng (Trường ĐHSP Hà Nội). Ở đây tôi khôngtrình bày lại. Chỉ xin lưu ý một điểm là việc xây dựng được hàm chặt nhánh đơngiản và hiệu quả là một nghệ thuật và luôn có trường hợp hàm chặt nhánh khônghiệu quả. Phương pháp nhánh cận thường hay sử dụng trong thực tế khi dữ liệuvào có một số các dạng nhất định (không phải ngẫu nhiên).

Trên đây tôi đã tổng kết hai dạng duyệt toàn bộ thường gặp trong các bài toánthi học sinh giỏi. Có 4 nhận định đề nghị mọi người nhận xét và cho ý kiến:

1. Để cải tiến thuật toán duyệt toàn bộ sử dụng các vòng lặp lồng nhau phươngpháp thường dùng là khử vòng lặp trong bằng cách sử dụng các thông tin cóđược từ vòng lặp ngoài và các cấu trúc dữ liệu thích hợp.

2. Sử dụng kỹ thuật chia đôi có thể đưa bài toán kích thước n về bài toán kíchthước n/2 sau đó dùng các kỹ thuật ở phần trên giải quyết tiếp.

3. Khi các thành phần của bộ cần duyệt có nhiều ràng buộc với nhau thì việc tìmmột thứ tự duyệt thích hợp hoặc giải hệ phương trình cho một chương trìnhduyệt hiệu quả hơn.

4. Hàm chặt nhánh phải đủ đơn giản thì kỹ thuật duyệt kết hợp với chặt nhánhmới tỏ ra hiệu quả.

Xin chân thành cảm ơn!

TÀI LIỆU THAM KHẢO

Page 160: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

161

1. "Cấu trúc dữ liệu và giải thuật" - TS Lê Minh Hoàng (ĐHSP Hà Nội)

2. "Tài liệu sách giáo khoa chuyên Tin tập 1,2" - Nhiều tác giả.

Page 161: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

162

GIỚI THIỆU PHƯƠNG PHÁP QUY HOẠCH ĐỘNG

Vũ Mạnh Hà – Chuyên Vĩnh Phúc

Quy hoạch động (Dynamic Programming) là phương pháp giảibài khá phổ biến đối với những bài toán tối ưu trong các kỳ thi họcsinh giỏi Tin. Phương pháp này, giống như đệ quy, tuân theo chiếnlược chia để trị. Điểm khác biệt cơ bản là trong khi đệ quy thực hiệntruy hồi từ trên xuống thì quy hoạch động tính truy hồi từ dưới lênkèm với các bảng lưu kết quả.

Mang đậm dấuấn của tư duy Đại số tổ hợp cùng vớiđặc trưng kỹthuật trong lập trình, việcáp dụngquy hoạch động vào giải các bài tậpTin học là không hềđơn giảnđối với học sinh. Nhất là hiện nay, hầuhết các bài tập vềquy hoạch động đềuđược nâng thêm một tầm caomới. Điều này thể hiện rõ trong đề thi VOI cũng nhưIOI.

Bài viết dưới đây xin giới thiệu sơ lược về phương pháp quyhoạch động và một số tiếp cận nâng cao. Bài viết dựa trên tham khảoebook “Giải thuật và Lập trình” của tác giả Lê Minh Hoàng, sách“Một số vấn đề chọn lọc trong Tin học” của nhóm tác giả NguyễnXuân My – Trần Đỗ Hùng – Lê Sĩ Quang, cũng như một số đề thiVOI, IOI, online contest, …và kinh nghiệm bản thân. Mong nhậnđược các trao đổi và chỉ dẫn của các bạnđồng nghiệp.

Sơ lược về Quy hoạch độngPhương pháp quy hoạch động dùng để giải bài toán tối ưu có bản chất đệ

quy, tức là việc tìm phương án tối ưu cho bài toán đó có thể đưa về tìm phươngán tối ưu của một số hữu hạn các các bài toán con. Đối với nhiều thuật toán đệquy, nguyên lý chia để trị (divide and conquer) đóng vai trò chủ đạo trong việcthiết kế thuật toán. Để giải quyết bài toán lớn ta chia nó làm nhiều bài toán concùng dạng để có thể giải quyết độc lập. Trong phương pháp quy hoạch động,nguyên lý này càng được thể hiện rõ: Khi không biết cần phải giải quyết nhữngbài toán con nào, ta sẽ giải quyết tất cả những bài toán con và lưu trữ nhữnglời giải hay phương án của chúng nhằm mục đích sử dụng lại theo một sựphối hợp nào đó để giải quyết những bài toán tổng quát hơn. Đó chính là điểm

Page 162: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

163

khác nhau giữa Quy hoạch động và phép phân giải đệ quy và cũng lànội dungphương pháp quy hoạch động.

Phép phân giải đệ quy bắt đầu từ bài toán lớn phân rã thành nhiều bài toáncon và đi giải từng bài toán con đó. Việc giải từng bài toán con lại đưa vềphép phân rã tiếp thành nhiều bài toán nhỏ hơn và lại đi giải tiếp bài toán nhỏhơn đó bất kể nó đã được giải hay chưa.

Quy hoạch động bắt đầu từ việc giải tất cả các bài toán nhỏ nhất (bài toáncơ sở) để từ đótừng bước giải quyết những bài toán lớn hơn, cho tới khi giảiđược bài toán lớn nhất (bài toánban đầu).

Trước khi áp dụng phương pháp quy hoạch động ta phải xét xem phươngpháp đó có thoả mãn những yêu cầu dưới đây hay không:

Bài toán lớn phải phân rã được thành nhiều bài toán con, mà sự phối hợp lờigiải của các bài toán con đó cho ta lời giải của bài toán lớn.

Vì quy hoạch động là đi giải tất cả các bài toán con, nên nếu không đủkhông gian vật lý lưu trữ lời giải (bộ nhớ, đĩa...) để phối hợp chúng thìphương pháp quy hoạch động cũng không thể thực hiện được.

Quá trình từ bài toán cơ sở tìm ra lời giải bài toán ban đầu phải qua hữu hạnbước.

Các khái niệm:

Bài toán giải theo phương pháp quy hoạch động gọi là bài toán quy hoạchđộng.

Công thức phối hợp nghiệm của các bài toán con để có nghiệm của bài toánlớn gọi là công thức truy hồi của quy hoạch động.

Tập các bài toán nhỏ nhất có ngay lời giải để từ đó giải quyết các bài toán lớnhơn gọi là cơ sở quy hoạch động.

Không gian luu trữ lời giải các bài toán con để tìm cách phối hợp chúng gọilà bảng phương án của quy hoạch động.

Các bước cài đặt một chương trình sử dụng quy hoạch động:

Giải tất cả các bài toán cơ sở (thông thường rất dễ), luu các lời giải vào bảngphương án.

Dùng công thức truy hồi phối hợp những lời giải của những bài toán nhỏđãlưu trong bảngphương án để tìm lời giải của những bài toán lớn hơn và lưuchúng vào bảng phuong án, chotới khi bài toán ban đầu tìm được lời giải.

Dựa vào bảng phương án, truy vết tìm ra nghiệm tối ưu.

Page 163: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

164

Cho đến nay, vẫn chua có một định lý nào cho biết một cách chính xác nhữngbài toán nào có thểgiải quyết hiệu quả bằng quy hoạch động. Tuy nhiên để biếtđược bài toán có thể giải bằng quyhoạch động hay không, ta có thể tự đặt câuhỏi: “Một nghiệm tối ưu của bài toán lớn có phải là sự phối hợp các nghiệmtối ưu của các bài toán con hay không?” và “Liệu có thể nào lưu trữ đượcnghiệm các bài toán con dưới một hình thức nào đó để phối hợp tìm nghiệmcủa bài toán lớn?”, v.v.

Sau đây là vài ví dụ quen thuộc có tính kinh điển của Quy hoạch động:

Ví dụ1. Bài toán cái túi (Knapsack).

Đề bài:

Một tên trộm sau khi mởđược một két sắt thì nhận thấy trong đó có chứa Nloạiđồ vật có kích thước và giá trị khác nhau (số lượng mỗi loại làđủ lớnđể coi làvô hạn). Nhưng hắn chỉ có một cái túi có dung lượng M (chứađược một sốđồ vậtsao cho tổng kích thước của cácđồ vật này không vượt quá M). Vấnđềđặt ra làtên trộm phải lựa chọn một danh sách cácđồ vật và số lượng mỗi loạiđể mang đisao cho tổng giá trị thu được là lớn nhất.

Ta coi kích thước và giá trị của loạiđồ vật thứ i tương ứng làsize[i] vàvalue[i]. N ≤ 100;M ≤ 10000.

Phân tích:

Có hai cách tiếp cận, theo dung lượng túi M hoặc theo sốđồ vật N, bằng tưduy đại số tổ hợp thông thường có thể thấy ngay rằngphải chọnN làmđốitượngđể lập công thức truy hồi.Lần lượt duyệt qua các số lượngđồ vật i = 1..N,đặt f[j | j=0..M] là giá trị tốt nhất cóđược bằng cách dùng i loạiđồ vậtđầu tiêncho vào túi dung lượng j.

Trước hết xétN=0, hiển nhiên với mọi dung lượngj=1..M, tổng giá trịtốtnhấtluôn bằng 0 hay f[?]=0.

N=1, do chỉ có một loạiđồ vật nên chỉ còn cáchnhét càng nhiều càng tốt, tổnggiá trị maxứng với mỗi dung lượng j=1..M sẽ làf[j] = (j div size[1])*value[1].

N=i>1. với mỗi j xét cáchlấp đầy size[i] dung lượng cuối cùng của túi (dunglượng j). Có hai khả năng:

Page 164: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

165

Có lấpđầy bằngđồ vật i: f[j] = f[j - size[i]] + value[i]

Không cần lấpđầy bằngđồ vật i: f[j] = f[j]cũ.

Tức là f[j] = max{f[j]cũ, f[j-size[i]]đã tính+ value[i]}, ta tìm cáchđặtdấu vết choviệc có sử dụng hay không đồ vật i cho dung lượng j. Chẳng hạn, nếu có,gántr[j] = i.

Như vậy có thể viếtđoạn mã quy hoạch động:

fillchar(f, sizeof(f), 0); fillchar(tr, sizof(tr), 0);

for i := 1 to N do

for j := size[i] to M do

if f[j] < f[j-size[i]]+value[i] then

begin

f[j] := f[j-size[i]]+value[i];

tr[j] := i;

end;

Bây giờ xét quá trình truy vết tìm lại phương án. Bắtđầu bởi j = M, rõ ràngtr[j] làđồ vậtđượcđặt vào cuối cùng, vậy cần nhảyđến j = j-size[tr[j]], lặp lại nhưthếđến khi tr[j] = 0 ta thu được danh sách cácđồ vậtđã dùng.Để có thứ tự tăngdần và số lượng cácđồ vật, pha truy vết sẽ cần bổ sung một mảng mộtchiềuđểđếm phân phối (Distribution Couting).

Đánh giá, tổng hợp:

Độ phức tạptính toáncủa thuật toán: pha quy hoạchđộng là O mn ; pha truy

vết là O m độ phức tạp chung là O mn (cái này có thể khẳngđịnh dễ dàng

theo đoạn code ở trên). Chi phí bộ nhớ là O max m, n

Bài toán này có một phiên bản khác: dữ liệu vào không phải làcácloại đồ vậtmà làcác đồ vật, khi đó ta không thểlấpđầytúi một cách tuỳ tiện mà chỉ có thểxét xem có hay không đồ vật thứ i, tư tưởng này gần giốngbài toán xây dựngtổng xétở ví dụ 3.

Page 165: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

166

Trong thuật toán trên, chi tiết quan trọng nhất là: Một khi đã biết cách tốtnhấtđể bỏđồ vào các túi có dung lượng bất kì với i đồ vậtđầu tiên, ta không cầnxét lại vấnđề này nữa, bất kể sau đó là các loạiđồ vật như thế nào. Tức là cácđồvật loại i+1..N không ảnh hưởngđến quyếtđịnhđã có khi chỉ xét cácđồ vật 1..i.Đây chẳng những là nguyên lý cơ bảnđể giải bài này mà còn là nguyên lý tổngquát cho cả phương pháp quy hoạch động. Phương pháp quy hoạch động chỉứng dụng được khi việc xuất hiện kích thước mới lớn hơn không làm thay đổikết quả bài toánvới kích thước nhỏ.

Ví dụ 2: Phép nhân tổ hợp nhiều ma trận (Matrixes Multiplier)

Đề bài:

Cho dãy ma trận M1, M2, …, MN với kích thước tương ứng là (p1; p2), (p2;p3), …(pN; pN+1). Cần nhân dãy ma trận này theo quy tắc nhân ma trận thôngthường (tích hai ma trận (p;q) và (q;r) được tính sau pqr phép nhân). Hãy tìmmột thứ tự nhân sao cho tốn ít phép nhân nhất.Cho N ≤ 100, pi ≤ 100.

Phân tích:

Trước hết nói về số trình tự nhân có thể. Mỗi trình tự nhân xem như một cáchđặt N cặp vào dãy M1M2…MNđể thu được một biểu thức nhân đơn giản hợp

lệ. Số lượng đó chính là cn(số Catalan thứ n, phép tìm truy hồi số này cũng dùngquy hoạch động). Cn là rất lớn nên không thể dùng cách thử nghiệm tất cả để rútra trình tự tốt nhất được.

Ta xét từ trường hợp cơ sở, chỉ có một cách nhân với mỗi cặp ma trậnM1*M2, M2*M3,… Với mỗi bộ ba ma trận, (A, B, C) chẳng hạn,chi phí nhỏ nhấtđược tìm ra bằng cách so sánh hai trình tự A*(B*C) và (A*B)*C. Làm như thếvới mọi bộ ba ma trận kế tiếp xong, ta chuyển sang các bộ bốn, … Cứ như vậycuối cùng ta tìm được chi phí nhỏ nhất để nhân N ma trận. Hàm quy hoạchđộngcó thể viết:

i k 1 j 1

0 / i jf (i, j)

min f (i, k) f (k 1, j) p *p *p / i k j;

Tức là, chi phí bằng 0 vớiđoạn một ma trận. Với cácđoạn nhiều hơn một matrận (i<j), bằng giả thiếtđã tính toán xong cho mọiđoạn con, ta xét qua tất cả cáccách chia đoạn thành hai đoạn con [i, k] và[k+1, j], chi phí với mỗiđoạn con đãcó, ma trận kết quả của hai đoạn con tương ứng là (pi; pk+1) và (pk+1, pj+1) chi

Page 166: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

167

phí nhân hai ma trận này là i k 1 j 1p *p *p . Từđó chọn ra cách nhân tốiưu chođoạn[i, j].

Đánh giá, tổng hợp:

Độ phức tạp tính toán của thuật toán là O(n3), bộ nhớ cần O(n2) – chính xáclà 2n2 vì còn cần mảng vết. Pha truy vết thực ra cần cài bằngđệ quy với một chútchúý về cách xử lí việc viết ra biểu thức với các dấu ( ) chỉ rõ trình tự nhân.

Ví dụ 3: Bài toán xây dựng tổng – chia kẹo

Đề bài:

Cho N gói kẹo (N ≤ 100), gói kẹo thứ i chứa ai viên kẹo (ai≤ 200). Chia cácgói kẹo này thành hai phần sao cho số viên kẹo chênh lệch giữa hai phần làítnhất có thể.

Phân tích:

Có thể phát biểu lại bài toán thành: “Cho N số nguyên dương a1, …, aN cótổng là S hãy xây dựng tổngM lớn nhất nhỏ hơn S div 2 mà mỗi số ai chỉ dùngkhông quá một lần”. Rõ ràng cácgói kẹotham gia xây dựng nên tổng M chính làcác gói kẹo của một phần, chênh lệch tối thiểu bằng S – 2M.

Xét trường hợp cơ sở N = 0, có ngay M = 0, nói cách khác làđã có tổng 0được xây dựng.

Với N = 1, bổ sung vào tập tổngđãđược xây dựng – {0} thành{0, a1} Tổngquát vớiN = i bất kì gọi Si là tập tổng xây dựngđược mà chỉ dùng các số trong i sốđầutiên, ta có:

i i i 1S T+a | T S

Tất nhiên để càiđặt ta sẽ dùng một mảng một chiều thay cho khái niệm tậptổng, mảng này có vai tròđánh dấu những tổngđã xây dựngđượcở từng bước.Thậm chí có thể dùng ngay nóđể lưu vết chỉ ra phương án.

Ngoài ra, về mặt kĩ thuật càiđặt, ở bài này cần chúý tránh tình trạng tổngvừađược xây dựng lại dùngđể xây dựng tiếp ngay trong một bước (tức là một sốdùng nhiều hơn một lần).

Đánh giá, tổng hợp:

Page 167: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

168

Bài này rấtđơn giản, thậm chí có thể coi là không dùng quy hoạch động, tuynhiên cách tiếp cận: “bổ sung vào tập tổng đã được xây dựng” là một cách nghĩcó tính phổ dụng cao. Nhìn chung, tư tưởng giải như thế có thể gặpở rất nhiềubài. Đặc biệt là khi kiểm soátđược không gian nghiệm (đủ bộ nhớ).

Vềđộ phức tạp, do phải duyệt qua N gói kẹo và với mỗi gói phải thử với từngtổngđã có nên nói chung độ phức tạp tính toán là O(SN), có thể cải tiếnđể làmgiảmđi một hằng số C lần, chẳng hạn O(S/2*(N-1)). Chi phí bộ nhớ làO(max(S,N)), pha truy vết tốn O(N).

Ví dụ 4: Dãy con chung dài nhất

Đề bài:

Cho hai dãy số nguyên 1 2 ma ,a ,..., a và 1 2 nb ,b ,..., b (1 ≤ m, n ≤ 100). Hãy xácđịnh

dãy con chung dài nhất của hai dãy này.

Phân tích:

Đặt f i, j làđộ dài dãy con chung cực đại của hai dãy 1 2 ia ,a ,..., a và 1 2 jb ,b ,..., b .

Cơ sởquy hoạch động là f 0,? 0 và f ?, 0 0 .

Trường hợp tổng quát với i, j tuỳý, ta có:

i ja b : f i, j f i 1, j 1 1 ; dễ dàng chứng minh được f i 1, j , f i, j 1

không thể vượt qua f i 1, j 1 .

i ja b : f[i, j] max f i 1, j , f i, j 1

Như vậy, kết quả tốiưu nằm trong f m, n . Để truy vết tìm phương án, ta sẽlần ngược từ f m, n quay lên đến f 0, 0 . Với một vị trí i, j ta có các khả năng:

f i, j f i 1, j 1 : đưa ai vào dãy con.

f i, j f i, j 1 : chuyển sang vị trí i, j 1 .

f i, j f i 1, j : chuyển sang vị trị i 1, j

Rõ ràng sau O m n bước, dãy con chung lớn nhấtđược xácđịnh. Vấnđề là

cần tránh sự kiệnđi ra ngoài bảng, muốn thế, có thểđặt viền cho bảng (

f 1,? ; f ?, 1 1 chẳng hạn).

Page 168: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

169

Đánh giá, tổng hợp:

Bài toán này là một ví dụ mẫu mực của phương phápquy hoạch động haichiều. Tuy nhiên việcđưa ra f i, j ban đầu có vẻ tuỳ tiện. Sự thực là trong các

bài giải quy hoạch động, hàm mục tiêu f thường có vài cáchđặt, trong đó có mộtcách tốiưu hơn hẳn. Một phân tích chặt chẽ phải duyệt qua hết các cách và chỉ racái nào tốt nhất.

Ởđây chẳng hạn còn có cáchthứ hai: đặt f i, j làđộ dài dãy con chung lớn

nhất của hai dãy 1 2 ia ,a ,...,a và 1 2 jb , b ,..., b mà kết thúc bằng ai (hoặc bj). Nhưng như

thế thì kết quả tốiưu phảiđược chọn là 1 i n

f i, nmax

. Mặt khác, trong mỗi bài

toán con cũngđều cần một phép duyệt tương tự, điều này làm cho độ phức tạpcủa thuật toán tăng lên một hằng số 2 hoặc 3.

Vấnđề làở ví dụ 1, ta đã sử dụng phép xét giống cách thứ hai. Vậy thì bàitoán nào chọn cách: với kích thước i, xét có i và không có i – khi đó phải duyệtqua mọi kích thước nhỏhơn; bài toán nào chọn cách: với kích thước i, xétchung chung f i, j – khi đó chỉ xét qua kích thước i và i 1 ; bài toán nào chọn

cách khác, … Câu trả lời là chẳng có một nguyên lý hay khuôn mẫu nào hết,việc có chọnđược cách xéttốt nhất hay không đơn thuần là do kinh nghiệm. Vậylàm thế nàođể có kinh nghiệm? Phảiđặt từng bài toán dưới nhiều góc nhìnvàđánh giá rồi chọn lựa. Mặt khác, cũng giống như tất cả các khoa học khác,giải được một bài bằngquy hoạch động là chưa đủ, còn phải thêm sự tự tổnghợpđể làm dày thêm vốn của bản thân nữa. Không có sự tự giác này thì dẫu cólàm thật nhiều bài tập cũng sẽ vô nghĩa.

Trở lại thuật toán, độ phức tạp tính toán của pha quy hoạch động là O mn ;

độ phức tạp tính toán của pha truy vết là O m n ; bộ nhớ tốn O mn . Có thể rút

bỏ mảng vết như trình bày trên. Còn nếu muốn chuyển thànhquy hoạch độngmột chiều thì f sẽ tính theo từng cột, dùng cột trước tính cột sau; nhưng như thếlại không thể bỏ mảng vết mặc dù có thể thu gọn lạiđể dùngcáchđánh dấu trênbit với dữ liệu lớn.

Một số tiếp cậnnâng caoTrong chương trước, ta đã nói một cách sơ lược về phương phápquy hoạch

động cùng một số ví dụđiển hình có thể dùng làm mẫu nhằm phân tích cácháp

Page 169: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

170

dụngquy hoạch động cho học sinh. Chương này sẽ trình bày một vài bài toánquyhoạch động độcđáo: giảm số chiều quy hoạch động; quy hoạch động trên hìnhhình học, quy hoạch động trên cây (đồ thị), quy hoạch động hai lớp, …

Ví dụ 1: Cắm hoa (IOI 1999)

Đề bài:

Cần cắm k bó hoa khác loại nhau (đánh số thứ tự 1..k) vào n lọ xếp thẳnghàng (đánh số thứ tự 1..n) sao cho hoa có số hiệu nhỏ được đặt trước hoa có sốhiệu lớn. Với mỗi loại hoa i ta biết giá trị thẩm mỹ khi cắm hoa đó vào lọ j làv[i,j]. Các số liệu đều là số tự nhiên và được ghi cách nhau bởi dấu cách trênmỗi dòng.

Dữ liệu vào ghi trong file văn bản HOA.INP: dòng đầu tiên là hai trị k và n.Từ dòng thứ hai trở đi là các giá trị v[i,j] với i=1..k và j=1..n; 1 ≤ k ≤ n ≤ 100.

Kết quả ghi trong file văn bản HOA.OUT gồm hai dòng: dòng đầu tiên làtổng giá trị thẩm mỹ của phương án cắm hoa tối ưu. Từ dòng thứ hai là dãy k sốhiệu lọ được chọn cho mỗi bó hoa.

Phân tích:

Gọi T(i, j) là giá trị thẩm mỹ khi cắm i bó hoa vào j lọ, cơ sởquy hoạch động

là:

Nếu số bó hoa nhiều hơn số lọ, i> j thì không có cách cắm nào;

Nếu số bó hoa bằng số lọ, i = j thì chỉ có một cách cắm là bó nào vào lọđó.

Xét trường hợp tổng quátsố bó hoa ít hơn hẳn số lọ i j . Có hai tình

huống: lọ cuối cùng, tức lọ thứ j,được chọn hay không được chọn cho phươngán tốiưu:

Nếu lọ thứ j được chọn tức là trong lọ đó ta sẽ cắm bó hoa cuối cùng, bóthứ i. Số i 1 bó hoa đầu tiên sẽ được phân phối vào j 1 lọ đầu tiên. Giátrị thẩm mỹ khi đó sẽ là: T i 1, j 1 v i, j ;

Nếu lọ thứ j không được chọn cho phương án tối ưu thì i bó hoa phải đượccắm vào j 1 lọ đầu tiên và do đó giá trị thẩm mỹ sẽ là: T i, j 1 .

Tổng hợp lại ta có giá trị tối ưu khi cắm i bó hoa vào j lọ sẽ là:

Page 170: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

171

T i, j max T i 1, j 1 v i, j , T i, j 1 .

Tổ chức dữ liệu và chương trình: Dễ thấy có thể dùng mảng T là mảng haichiều. Ngoài ra ta còn cần đặt trong mỗi ô của bảng trên một mảng dữ liệu baogồm n phần tử để đánh dấu lọ hoa nào được chọn cho mỗi tình huống (vết). Gọimảng dữ liệu đó là L i, j , ta dễ thấy là nên điền bảng lần lượt theo từng cột, tại

mỗi cột ta điền bảng từ trên xuống hoặc dưới lên theo luật sau:

Nếu T i 1, j 1 v i, j T i, j 1 thì ta phải thực hiện 2 thao tác:

o Đặt lại trị T i, j : T i 1, j 1 v i, j ;

o Ghi nhận việc chọn lọ hoa j trong phương án mới, cụ thể lấyphương án cắm hoa i 1, j 1 rồi bổ sung thêm việc chọn lọ hoa j:

L i, j : L i 1, j 1 và đánh dấu phần tử j trong mảng L i, j .

Nếu T i 1, j 1 v i, j T i, j 1 thì ta chỉ cần copy L i, j 1 sang L i, j , vì

ta bảo lưu phương án i, j 1 .

Đếnđây ta xét số chiều quy hoạch động: Phương án dùng mảng hai chiềuchịu phí tổn bộ nhớ là O kn . Đểý rằng mỗi cột của T với cách truy hồi trên chỉ

tính qua cột liền trước và phầnđầu của chính nó. Từđó ta có thể dùng mộtmảng một chiều T[0..k] xem như một cột của bảng T nói trên. Ta phảiduyệt jbước, tại bước thứ j (kích thước j), giá trị T[i] sẽ là trị tối ưu khi cắm i bó hoavào j lọ. Như vậy, tại bước thứ j ta có:

Nếu T i 1 cũ v i, j T i cũ thì ta phải thực hiện 2 thao tác:

o Đặt lại T i : T i 1 cũ v i, j ;

o Ghi nhận việc chọn lọ hoa j trong phương án mới, cụ thể lấyphương án cắm hoa i 1 ở bước j 1 rồi bổ sung thêm việc chọn

lọ hoa j: L i : L i 1 cũ và đánh dấu phần tử j trong mảng L[i].

Nếu T i 1 cũ v i, j T i cũ thì ta không phải làm gì vì sẽ bảo lưuphương án trước.

Biểu thức so sánh cho biết khi cập nhật mảng T từ bước thứ j 1 qua bước

thứ j ta phải tính từ dưới lên, nghĩa là tính dần theo chiều giảm của i i j 1 .

Page 171: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

172

Để đánh dấu các lọ hoa ta dùng mảng L[0..MN] mỗi phần tử là một dãy 15byte. Nếu dùng một bit cho mỗi lọ hoa thì với 15 byte ta có thể đánh dấu cho15*8=120 lọ hoa. Khi cần đánh dấu lọ hoa thứ j trong dãy L[i] ta bật bít thứ j.Trong pha truy vết khi cần xem lọ thứ j có được chọn hay không ta gọi hàmGetBit j .

Để xác định byte thứ mấy trong dãy chứa bit j ta tính: b : j shr 3 { j div 8} ;

Để xác định vị trí của bit j trong byte thứ b ta tính: p : j and 7 { j mod 8} ;

Với j 0 , tức là khi không có lọ nào và không có bó hoa nào ta khởi trị:

fillchar L 0 ,sizeof L 0 ,0 ; và T 0 : 0 ;

Với mỗi j=1..n, ta lưu ý số bó hoa phải không lớn hơn số lọ, tức là i j Với

i j ta sẽ cắm mỗi bó vào một lọ. Để thực hiện điều này ta lưu ý rằng phần tử L j 1 tại bước trước đã cho biết j 1 lọ đều có hoa do đó ta chỉ cần đánh dấu lọ

thứ j cho bước j là xong:

L j : L j 1 ; OnBit j, j ;

Đánh giá, tổng hợp

Bài này một mẫu về thu hẹp số chiều quy hoạch động. Đểý rằng ta đãđưathuật toánquy hoạch động hai chiều vềquy hoạch động một chiềunhờ các nhậnxét sau:

Bảng phương án (hay hàm quy hoạch động, hay hàm mục tiêu) được tínhtheo cột mà cột sau xácđịnh chỉ thông qua một cộtliền trước.

Vết lưu phương án tuy không thể giảm số chiềunhưng có miền giá trịđơngiản, có thể làm giảm kích thước bằng cáchdùng bit để biểu diễn.

Từđó rútra các yếu lĩnh trong tốiưu hoá phương pháp quy hoạch động:

Tránh công thức truy hồi qua mọi kích thước nhỏ hơn (mà chỉ thông quamột hằng số C kích thước liền trước, ở bài này C = 1). Điều này là nhằm sửdụngkỹ thuật chồng mảng trong tính toán.

Nếu phải chỉ ra phương án (cấu hình) ứng với giá trị tốiưu tìmđược thì vếtphảiđượcđánh dấuđơn giảnđểsử dụng mẹo trong lưu giá trị (xử lý bit như bàinày, chẳng hạn). Lưu ý rằng làm giảm số chiềuquy hoạch động đồng nghĩa vớiviệcbắt buộc phải có mảng vết mà việc thu nhỏ số chiều làrất khó.Tất nhiên

Page 172: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

173

loại trừ một số bài toán giống như ví dụ 1 chương trước, ởđó số chiều chỉ là1 vàvết có thể tìm ngay trong bảng phương án.

Cácđoạn mã xử lí và lấy kết quả có thể như sau:

procedure xuly;

var

i,j:byte;

begin

fillchar(L[0],16,0);

T[0]:=0;

for j:=1 to n do

begin

L[j]:=L[j-1];

onbit(j,j);

T[j]:=T[j-1]+v[j,j];

for i :=j-1 downto 1 do

if T[i] < T[i-1]+v[i,j] then

begin

T[i]:=T[i-1]+v[i,j];

L[i]:=L[i-1];

onbit(i,j);

end;

end;

end;

procedure inKQ;

var

i: byte;

begin

assign(output,fOut) ;

rewrite(output);

writeln(T[k]);

for i:=1 to n do

begin

ifgetbit(k,i)=1then

write(i, ‘ ‘, bl);

end;

close(output);

end;

Page 173: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

174

Ví dụ 2: Gửi tiền tiết kiệm

Đề bài:

Bạn cómột số tiền S và dựđịnh mua sổ tiết kiệm trong T năm.Có d loại sổtiết kiệm, mỗi sổ có kì hạn một năm; sổ thứ i có mệnh giá aitiền lãi bi.Saumỗi năm được phép bán đi, mua lại sổ.Tính số tiền thu được lớn nhấtsau Tnăm.Ví dụ:

S = 10000; T = 4; D = 2;

a 4000,3000 ; b 400, 250 . Kết quả tối ưu: 14050, phương án tươngứng:

Năm đầu mua 2 sổ loại 2, 1 sổ loại 1 thu lãi 900 được tổng 10900;

Năm thứ haivẫn mua như trên được tổng 11800;

Năm thứ bamua 1 sổ loại 2, hai sổ loại 1 được tổng 12850;

Năm cuốimua 3 sổ loại 1 được tổng 14050.

Input: TIETKIEM.INP

Dòng đầu tiên ghi N = số test; mỗi test gồm: dòng thứ nhất ghiST s 1000000, t 40 ; dòng thứ hai ghiD D 30 ;dòng cuối (của test) ghi các

cặp ai,bi (ai là bội của 1000, 6ia 10 , i ib 10%a )

Output: TIETKIEM.OUT

Ứng với mỗi test là một dòng ghi số tiền lớn nhất thu được.

Phân tích:

Xét T = 1, dễ thấy bài toán trở thành một phát biểu khác của bài toán Túixách (Knap Sack): tìm cách lấp đầy dung lượng S bằng các kích thước a1, a2,…, ad sao cho hiệu quả đạt giá trị lớn nhất. Điểm khác biệt là cách tính giá trịmỗi đồ vật – sổ tiết kiệm: bằng tổng của kích thước (mệnh giá) và tiền lãi,

value i a i b i .

Mặt khác, do lãi suất hằng năm không vượt quá 10% nên sau maxD 30

năm, số tiền thu được không vượt quá 20.000.000. Vậy thì hoàn toàn có đủkhông gian lưu trữ cho thuật toán quy hoạch động .

Như vậy, hoàn toàn có thể coi các năm là như nhau theo nghĩa có một sốtiền S, cần mua sổ tiết kiệm để lợi nhuận trong năm đó là lớn nhất. Bài toáncủa năm sau độc lập với bài toán của năm trước, kết quả của bài toán nămtrước trở thành đầu vào của bài toán năm sau. Tức là việc giải trọn vẹn bàitoán trở thành thực hiện quy hoạch động T lần.

Page 174: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

175

Nhưng có một điều dễ nhận thấy là trong T lần quy hoạch động, có rấtnhiều giá trị được tính lại vì kích thước (số tiền) phát sinh thêm qua mỗi nămlà tương đối nhỏ. Chi tiết này đi ngược lại với nguyên lý quy hoạch động vàlàm giảm tốc độ thuật toán. Vậy nên chăng ta thực hiện quy hoạch động mộtlần cho đến Smax rồi với mỗi năm chỉ việc duyệt theo bảng tính sẵn này?

Thử xét cách quy hoạch động sau đây:Đặt f i (longint) là lợi nhuận thu được nhiều nhất sau một năm với lượng

tiền xuất phát bằng i. Với mỗi giá trị của i theo chiều từ nhỏ đến lớn, xét khảnăng mua từng loại sổ và so sánh, chọn khả năng tốt nhất. Ta viếtđoạnmãquy hoạch động như sau:for i := 0 to max

begin

f[i] :=0;

for j := 1 to d do

if (i-(v[j] div 1000)>=0) and (b[j]+f[i-(v[j]div 1000)]> f[i]) then

f[i]=b[j]+f[i-(v[j] div 1000)];

end;

Đoạn mã này trở thành phần tiền xử lí cho đoạn mã tính kết quả tốiưu sauT năm dướiđây:For i := 1 to t do

S := s + f[s div 1000];

Rõ ràng kết quả cuối cùngđược tìm ra nhanh, đồng thời mãlệnh rất đơngiản, ngắn gọn.

Đánh giá, tổng hợp:

So với cáchquy hoạch động T lần, thuật toánđưa ra ở trên là tốiưu hơnhẳn. Cóđược kết quảđó là bởi việcđánh giá, xét lại tư tưởng ban đầu theo cácnguyên lý cơ bản của quy hoạch động. Đây là công việc tối quan trọng tronggiải bất kỳ bài toán nào, sử dụng phương pháp gì. Điều quan trọng trongnghiên cứu vấnđề không phải chỉ là giải quyếtđược nó mà còn là qua đó làmrõ ràng hơn các tư tưởng, chiến thuật giải bài, mở rộng, thay đổi cách nhìnvấnđề, …

Vềđộ phức tạp, thuật toán trên cóđộ phức tạp tính toán là maxO S D ; chi

phí bộ nhớ là maxO S ; nếu đề bài thêm yêu cầu chỉ ra phương án tương ứng

thì pha truy vết cần thêm maxO S bộ nhớ cùngđộ phức tạp tính toán là

maxO(S T)

Page 175: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

176

Ví dụ 3: Hermes (IOI 2004)

Đề bài

Trong một thành phố hiệnđại dành cho các vị thần Hy lạp, về phươngdiện hình họcđường phốđược bố trí như một mạng lưới với các nút là cáctoạđộ nguyên x, y . Mỗi số nguyên z đều có hai con đường dọc, ngang ứng

với x = z và y = z. Bằng cách này mỗi cặp x, y nguyên đại diện cho mộtnútđều là nơi giao nhau của các con đường. Trong những ngày nắng nóng,các thần nghỉ ngơi tại các quánăn nằm tại các nút giao thông. Thần Hermeslà thần chuyên trách việc truyền tin, Hermes có thể di chuyển dọc theo cáccon phố và truyền tin bằng tia sáng cũng dọc theo các con phố. Hôm nay,Hermes cóN thông điệp cần chuyển cho N vị thần theo thứ tự. Vị thần thứ itrong danh sáchđang ở quánăn có toạđộ i ix , y . Do truyền tin bằng tia sáng

nên để truyền tin tới toạđộ i ix , y , Hermes chỉ cầnđến mộtđiểm trên đường

phố ix x hoặc iy y làđủ.

Giả sử Hermes xuất phát từ tổng hành dinh của các vị thần – điểm 0, 0

và khi truyền xong N tin, Hermes dừng lại, hãy tínhđộ dàiđườngđi ngắn nhấtmà Hermes cầnđi để hoàn thành nhiệm vụ.

Input: HERMES.INP

Dòng 1: số N nguyên 1 N 200 là số thông điệp.

N dòng tiếp theo là toạđộ N quánăn mà các thông điệp cầnđược gửi tới.Dòng thứ i trong N dòng này là cặp i ix , y nguyên i i1000 x , y 1000

tương ứng với thông điệp i.

Output: HERMES.OUT

Chỉ gồm một dòng duy nhất ghi số nguyên làđộ dàiđườngđi ngắn nhất màHermes cầnđi để gửi hết N thông điệp.

Phân tích

Trước hết nhận xét rằng việc bổ sung cặp 0 0x , y 0, 0 vào danh sách

cácđiểm cần truyền tin là khôngảnh hưởngđến kết quả cuối cùng. Mặt khác,tập cácgiá trịtoạđộ cần xét chỉ là 0 1 Nx , x ,..., x và 0 1 Ny , y ,..., y

Do việc truyền tin đến mộtđiểm có thể thực hiện bằng hai cách nên ta đặt

A i, j là chi phí nhỏ nhấtđểđếnđiểm i jx , y và truyềnxong tin thứ i

(phương dọc).

B i, j là chi phí nhỏ nhấtđểđếnđiểm j ix , y và truyềnxong tin thứ i

(phương ngang).

Page 176: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

177

Cơ sở quy hoạchđộng là j jA 0, j x ;B 0, j y . Ta xét việc truyền tin thứi 1;0 i n , có các trường hợp sau:

Truyền tin i 1 theo phương dọc từ i 1 jx ; y , chi phí A i 1, j , có hai

khả năng:

o Trướcđó truyền tin i theo phương dọc từ i jx , y , chi phí sẽ là

i i 1A i, j x x ;

o Trướcđó truyền tin i theo phương ngang từ i 1 ix , y , chi phí sẽ là

i jB i, i 1 y y

Như vậy i i 1 i j0 j NA i 1, j min A i, j x x , B i, i 1 y y

.

Truyền tin i 1 theo phương ngang từ j i 1x ; y , chi phí B i 1, j , có hai

khả năng:o Trướcđó truyền tin i theo phương dọc từ i i 1x , y , chi phí sẽ là

i jA i, i 1 x x ;

o Trướcđó truyền tin i theo phương ngang từ j ix , y , chi phí sẽ là

i i 1B i, j y y

Như vậy i j i 10 j NB i 1, j min A i, i 1 x x , B i, j y y

.

Kết quả cuối cùng là 0 j Nmin A n, j ,B n, j

.

Cácđoạn mã tương ứng là:

procedure init;var

j: li;begin

x[0] := 0; y[0] := 0;fillchar(a, sizeof(a), 0);fillchar(b, sizeof(b), 0);

for j := 1 to n dobegin

a[0, j] := kc(y[0], y[j]);b[0, j] := kc(x[0], x[j]);

end;end;

Page 177: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

178

procedure QHD;var

i, j: li;begin

for i := 0 to n-1 dobegin

for j := 0 to n dobegin

a[i+1, j] := max;b[i+1, j] := max;

if a[i+1, j] > a[i, j] + kc(x[i], x[i+1]) thena[i+1, j] := a[i, j] + kc(x[i], x[i+1]);

if a[i+1, j] > b[i, i+1] + kc(y[i], y[j]) thena[i+1, j] := b[i, i+1] + kc(y[i], y[j]);

if b[i+1, j] > b[i, j] + kc(y[i], y[i+1]) thenb[i+1, j] := b[i, j] + kc(y[i], y[i+1]);

if b[i+1, j] > a[i, i+1] + kc(x[i], x[j]) thenb[i+1, j] := a[i, i+1] + kc(x[i], x[j])

end;end;

end;

procedure inKQ;var

min, j: li;begin

min := max;for j := 1 to n dobegin

if min > a[n, j] then min := a[n, j];if min > b[n, j] then min := b[n, j];

end;

assign(output, fo);rewrite(output);writeln(min);close(output);

end;

Page 178: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

179

Đánh giá, tổng hợp:

Đây là một bài có tính chất hình học. Hàm quy hoạch động hết sức trừutượng, phức tạp, không dễ nhìn ra. Tuy nhiên, bài toán tuân thủđúng cácnguyên tắc sau:

Khi đã xét các A i,? ; B i,? thì việc xétđiểm i 1 không làm thay đổicác giá trịđó.

Điểm i 1 có 2 kiểuđi đến tínhđượcqua các kiểuđi đếnđiểm i.

Giới hạn lưu trữ làđủ nhỏ 200*200.

Quan trọng nhất làcác tin được truyền đi theo thứ tự.

Độ phức tạp tính toán là 2O N do i 0 N 1; j 0 N ; chi phí bộnhớlà 2O N vì hai mảng A, B đều có kích thước NxN. Thuật toán có thểphát biểuở dạng ba chiều với một chiều bằng 2 (số kiểu truyền tin), song việclập hàm sẽ phức tạp hơn bởi theo trên các trường hợpđược xét là tương đốiriêng biệt.

Ví dụ 4: Rebuild (2nd VN Online Contest)

Đề bài:

Đất nước Peace có N thành phố được đánh số từ 1 đến N. Sau một trậnđộng đất lớn, đường nối giữa các thành phố bị hư hại nghiêm trọng. Nhưngdo không đủ chi phí sửa chữa nên sau trận động đất mạng đường đi của đấtnước chỉ còn lại dạng của một đồ thị cây.

Theo dự báo sẽ còn một trận động đất nữa, để lên kế hoạch phòng tránhthiệt hại, vua Peaceful muốn biết có ít nhất bao nhiêu con đường bị pháhủy nữa thì sẽ tồn tại Q thành phố bị cô lập (trong Q thành phố nàygiữa 2 thành phố bất kỳ vẫn còn đường đi đến nhau).

Input: REBUILD.INP

Dòng đầu tiên là số lượng thành phố N và số nguyên Q

Các dòng tiếp theo mỗi dòng gồm 2 số u v trong đó u là cha của v trêncây, các dòng nàymô tả các con đường không bị phá hủy sau trận độngđất thứ nhất.

Output: REBUILD.OUT

Ghi 1 số nguyên duy nhất chỉ số lượng con đường ít nhất bị phá hủy đểtồn tại Q thành phố bị cô lập.

Page 179: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

180

Giới hạn:

1 ≤ Q ≤ N ≤ 150Phân tích:

Bài toán cho ta một đồ thị dạng cây, mà ta có thể hiểu yêu cầu của đề bàilà tìm cách xóa đi ít cung nhất sao cho cây ban đầu bị tách ra thành nhiềucây con trong đó có một cây con bao gồm q đỉnh.

Đặt parent i là nút cha của i. Mỗi nút trong cây sẽ đại diện cho một cây

con mà nó làm gốc. Lập mảng quan hệ qh i, j cho biết giữa hai nút i, j có

quan hệ cha con, tổ tiên hay không. Lại lập mảng num i chỉ số nút của cây

con gốc i (kể cả i).

Ta nhận xét:

Nếu tồn tại i để num i q thì số cạnh ít nhất cần xóa đi là 1, đó làcạnh parent i , i . Tất nhiên nếu cây ban đầu gồm q nút thì đáp số là 0.

Nếu không tồn tại i như trên thì ta cần tìm phương pháp tối ưu để bỏđi ít nhất các cây con (giữa 2 cây bất kỳ trong số chúng không có quanhệ cha con) sao cho tổng lượng nút của chúng ta bằng (N – q). Mỗicây con bỏ xem như chi phí 1.

Xét một cách bỏđi các cây con mà tổnglượng nútcủa chúng bằng j, trongcác cây con bỏđi giả sử cây con gốc i là cây con có gốc lớn nhất (để tránhnhầm lẫn ta coi nút i là lớn hơn nút j nếu i > j). Như vậy nếu không tính câycon gốc i thì các cây con bỏ còn lại thoả mãn tổng lượngđỉnh bằng j num i ,

đồng thời trong đó không có cây con nào có gốc lớn hơn i.

Vấnđề là khi tính từ các nút nhỏ lên, số nút bỏx vớii nhỏ có thểđã khá lớnvà việc tồn tại j i màsố nút bỏ y buộc phải có y x là hoàn toàn có thể xảy

ra. Tuy nhiên, điều này không làmảnh hưởngđến lập luận của ta vì nếu

qh i, j 1 thìắt có j là tổ tiên i, tức là nếuđã chọn i ta không thể chọn j và

ngược lại. Ta thiết lập hàmquy hoạch động như sau:

Gọi f i, j là số cây con ít nhất cần bỏ để tổng lượng nút của chúng

bằng j,trong đó có bỏ cây con gốc i là cây con có chỉ số lớn nhất, khi đó f i, j min f k, j num i 1 với k i và qh k, i 0 , mặt khác mọi cây

Page 180: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

181

tham gia tạo nên f k, j num i cũng không được có quan hệ cha con

hay tổ tiên với i;

Kết quả sẽ là 1 k Nmin f k, N q

Đánh giá, tổng hợp:

Điểm mấu chốt của bài toán làở việc xét cây con có gốc lớn nhất trongmột cách bỏ nàođó. Động tác này làm xuất hiện yếu tố thứ tự vàđồng thờilàm mất khả năng ảnh hưởng của nút xét sau đến kết quả của các nút xéttrước.

Công việc xây dựng các mảng parent i ; qh i, j ; num i cóđộ phức tạp tính

toán là 2O N , chi phí bộ nhớ là 2O N . Đây là các thao tác chuẩn bị cho thuật

toán chính.

Trong phầnquy hoạch động cần có ba vòng duyệt lồng nhau là i, j, k, vớimỗi k cần xét quay lui phương án cho f k, j num i tốn O lg N nên độ phức

tạp phần này là 3O n lg N .

Cách thức giải quyết bài toán là mộtđiển hình của việc phân tích làm nảysinh cácđối tượng dữ liệu mới, tạo ra các quan hệ thứ tự biên, … Chính haiđiều nàyđã góp phần hình thành tư tưởngáp dụng phương pháp quy hoạchđộng.

Page 181: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

182

CHƯƠNG TRÌNH TỰ HỌC TỰ BỒI DƯỠNG GIÁO VIÊN MÔN TINHỌC GIAI ĐOẠN 2011-2015

THPT Chuyên Sơn LaI. Tình hình chung

Trường THPT Chuyên Sơn La được thành lập từ năm 1995 cho đến

nay không ngừng phát triển, lớn mạnh và đã đạt chuẩn quốc gia giai đoạn

một. Trong đó bao gồm tám bộ môn chuyên. Riêng lớp Chuyên Tin được mở

từ năm học 2008 – 2009, có 1 lớp gồm có 11 học sinh. Cũng từ đó đến nay

chưa mở thêm được lớp Tin nào vì việc tuyển chọn học sinh vào lớp chuyên

Tin có nhiều hạn chế về chất lượng đầu vào.

1. Thuận lợi:

- Nhà trường luôn nhận được sự quan tâm, chỉ đạo sát sao của Sở

GD&ĐT Sơn La.

- Đội ngũ giáo viên dạy Tin học đều đạt chuẩn; có ý thức tự học, tự

bồi dưỡng nâng cao năng lực chuyên môn.

- Công tác chỉ đạo của BGH, giảng dạy của giáo viên nhà trường luôn

đồng bộ và thống nhất cao tạo nên sự chuyển biến rõ rệt về chất lượng.

2. Khó khăn:

- Trình độ chuyên môn của giáo viên dạy bộ môn tin học trong trường

chưa đồng đều.

- Cơ sở vật chất, điều kiện phụ vụ cho công tác giảng dạy còn hạn chế.

II. Kết quả đạt được:

Mặc dù việc phát triển qui mô lớp còn hạn chế nhưng về chất lượng

dạy và học bộ môn tin học vẫn đảm bảo chất lượng theo yêu cầu của bộ GD

& ĐT đề ra. Chưa có đội tuyển tham dự HSG quốc gia.

Page 182: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

183

III. Nội dung các chuyên đề sẽ triển khai:

1. Hình thức tổ chức , triển khai:

- Bồi dưỡng thông qua thanh kiểm tra; thông qua hội giảng, hội thi,

cuộc thi các cấp.

- Bồi dưỡng giáo viên thông qua tự học, tự bồi dưỡng của các cá nhân.

Công tác tự học, tự bồi dưỡng: Mỗi tháng, mỗi GV phải có ít nhất 2 nội dung

tự bồi dưỡng được trình bày trong sổ “tự BDCM” là:

- Giải 2 đến 4 bài tập nâng cao hoặc bài tập khó trong chương trình.

- Ngoài ra giáo viên phải ghi chép tất cả các nội dung tự học, tự bồi

dưỡng được thông qua các hình thức khác trong năm học.

- Bồi dưỡng thông qua dự giờ, hội giảng, thanh kiểm tra và các cuộc

thi của nhà trường và tổ chuyên môn: Mỗi cá nhân, tổ chuyên môn, BGH khi

dự giờ phải đánh giá, góp ý, rút kinh nghiệm cụ thể, trực tiếp đối với cá nhân

được kiểm tra, dự giờ...

- Tổ chức, phân công nghiên cứu từng chuyên đề chuyên sâu cho giáo

viên.

- Tổ chức và hướng dẫn cho học sinh về phương pháp nghiên cứu

khoa học.

- Tổ chức các đợt giao lưu, học tập, trao đổi kinh nghiệm cho giáo

viên và học sinh với các trường chuyên của tỉnh bạn.

- Tổ chức kiểm tra việc tự học ngoại ngữ để phục vụ cho giảng dạy và

nghiên cứu khoa học.

Page 183: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

184

- Thành lập đội tuyển học sinh giỏi môn Tin học và tổ chức ôn luyện.

2. Yêu cầu cần đạt:

-100% CBGV thực hiện đúng nội dung tự học tự bồi dưỡng do nhà

trường quy định. Nội dung tự học đảm bảo theo kế hoạch nhà trường đề ra,

đa dạng về hình thức và phong phú về các kiến thức tự bồi dưỡng.

- 30% GV tham gia học tập nâng cao trình độ đào tạo đạt trên chuẩn.

- Tất cả các GV tham gia đầy đủ các chương trình bồi dưỡng hè, các

chuyên đề bồi dưỡng do trường, sở Giáo dục và Đào tạo, bộ Giáo dục và

Đào tạo tổ chức.

- Đến năm 2015 tất cả các giáo viên dạy được môn chuyên Tin bằng

ngoại ngữ.

Page 184: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

185

KINH NGHIỆM PHÁT HIỆN VÀ BỒI DƯỠNG ĐỘI TUYỂN TINHỌC CỦA HẢI PHÒNG

Vũ ThịLan – trường THPT Chuyên Trần Phú

I. Công tác tuyển chọn:

1. Chọn từ lớp 10 Tin:

Không có môn chuyên nào chứa đựng nhiều yếu tố “bất lợi” như mônTin. Đầu vào lớp 10 rất ít học trò biết tin học lập tình. Làm thế nào để gâyđược hứng thú cho học sinh khi bắt đầu học một môn học rất khó như tin họclập trình, làm thế nào để chọn được những học trò có tư duy tốt mà ban đầuchưa biết ngôn ngữ lập trình, làm thế nào chọn được đúng những học sinh cóý chí để có thể theo được tới cùng mà không bỏ giữa chừng do tác động củangoại cảnh. Làm thế nào để khi kết thúc kỳ một lớp 10 đã phải có bộ khungđội tuyển khá rõ để các học sinh còn lại yên tâm học tập tin theo cường độgiảm bớt để dành thời gian cho đội tuyển.

- Ban đầu vừa dạy lập trình vừa dạy lồng vào đó là các bài toándiễn đạt theo ngôn ngữ lập trình Tin học để cho mọi học sinhđều có thể làm được và học cách diễn đạt theo ngôn ngữ tinhọc.

- Chữa bài lập trình với cường độ cao để đẩy nhanh tốc độ tìmhiểu ngôn ngữ lập trình và lập trình để giải các bài toán đã tìmra ngôn ngữ giải thuật.

Phương châm: sao liên tục đổi ngôi và cơ hội chia đều cho mọingười trong cách làm trên thực sự đã giúp chúng tôi trả lời được các câu hỏitrên để thành lập đội tuyển tốt nhất.

2. Chọn từ lớp 10 Toán:Xuất phát từ tâm lý của các học trò của lớp chuyên Toán vẫn còn niềm

say mê học tập với cường độ cao và khao khát được khẳng định mình chúngtôi đã thường phân công giáo viên đón chuyên tin khối 10 cũng là giáo viêndạy tin cho lớp 10 Toán để từ đó có thể phát hiện được những học sinh giỏitin của lớp Toán. Rõ ràng về mặt tư duy và khả năng hiểu giải thuật thì họcsinh lớp Toán quả là có ưu thế rõ rệt.

Page 185: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

186

Trong quá trình làm việc tôi còn nghiệm thấy một điều: sự có mặt củahọc trò lớp Toán còn mang thêm vai trò của chất xúc tác:

- Học trò lớp Toán thì muốn thể hiện rằng tôi là tư duy tốt hơn nên tôisẽ học tốt.

- Học trò lớp Tin thì cho rằng tôi có thời gian học môn Tin nhiều hơn vàđược học bài bản hơn từ lớp 10 nên cũng không chịu thể để lớp Toánvượt.

Kết quả cho thấy sự nỗ lực của tất cả học trò đội tuyển đều tăng lên rõrệt. Thực tế chúng tôi đã từng có 3 Huy chương Bạc quốc tế từ học sinh lớpToán, các học trò này không chỉ đạt giải khi còn ỏ trường phổ thông mà còntiếp tục khẳng định mình ở bậc đại học. Đó là:

Nguyễn Phương Ngọc – 2 Huy chương Bạc quốc tế - vô địch sinh viênthế giới về giải thuật năm 2006.

Khúc Anh Tuấn – huy chương Bạc quốc tế - thứ hạng 40 trong danh sáchTopCoder thế giới.

II. Công tác bồi dưỡng:

1. Những việc ban đầu:Như các đội tuyển địa phương khác chúng tôi trình độ của các thày cô

giảng dạy chuyên tin có hạn, điều mong muốn lớn nhất là làm thế nào để họctrò vượt hẳn thày và theo kịp được sự phát triển chung của những đội tuyểnlớn. Cách thức của chúng tôi thực hiện như sau:

Hướng dẫn học sinh cách học và hiểu bộ sách của thày Lê MinhHoàng. Từ đó học sinh có thể hiểu và tham khảo được kinh nghiệm từhệ thống bài tập lưu trữ của học sinh khóa trước.

Hướng dẫn học sinh tham gia các kỳ thi trên mạng.

Hướng dẫn học sinh làm bài theo các hệ thống luyện tập trên mạng.

Hướng dẫn học sinh đọc và dịch đề bằng tiếng anh.

Tạo dựng cho học sinh phong cách học tập thể: mỗi buổi tự học có họcsinh chọn bài, có học sinh làm test, làm chương trình chấm tự chấmcùng nhau sau buổi học rồi mới tham khảo bài lẫn nhau và tham khảobài mẫu trong kho lưu trữ.

2. Hỗ trợ từ cựu học sinh đội tuyển Hải Phòng:

Không ai có thể mang lại lời thuyết phục hiệu quả bằng người trongcuộc, chính vì vậy với mỗi khóa học sinh đón vào năm mới, ngay từ những

Page 186: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

187

tuần đầu của năm học, tôi luôn mời các cựu học sinh là những người cóthành tích tốt về nói chuyện với các học trò mới vào lớp trong cuộc nóichuyện đó, không có mặt của cô giáo: học sinh mới và cựu học sinh giao lưurất thoải mái, hỏi đủ những điều mình còn băn khoăn trong lòng. Như vậyvừa là lời thuyết phục tốt nhất cho học trò khóa mới hứng thú với đội tuyển,vừa tạo được mối liên hệ tốt giữa học sinh các thế hệ, hỗ trợ cho việc học tậpcủa các em.

Các học sinh khóa trước đã nhận được hỗ trợ rất tốt từ cô giáo vậy đếnkhóa sau các em coi việc làm hết lòng để giúp đỡ học trò khóa tiếp theo nhưlà một việc hết sức tự nguyện và thoải mái. Các em dạy đội tuyển vào cácdịp hè, vào các ngày các em được về nghỉ ở quê nhà, khi đội tuyển đi Hà Nộitập huấn và ngay cả các em đi du học cũng hết sức giúp đỡ qua mạng.

Truyền thống này cũng được nhấn mạnh với học sinh và phụ huynh đểphụ huynh hiểu rằng khi tham gia đội tuyển, các con không chỉ nhận đượckiến thức mà còn có được những điều lớn hơn, đó là mối quan hệ rất tốt giữahọc trò đội tuyển các năm, điều này sẽ mang lại rất nhiều lợi ích khi các emhọc tập và ra công tác.

III. Các công tác bên lề:

1. Làm cho phụ huynh yên tâm cho con học hết sức khi tham gia tậphuấn đội tuyển.

Hầu hết phụ huynh học sinh có quan điểm: mục tiêu duy nhất là conchúng tôi đỗ đại học, theo đội tuyển dẫn đến học lệch và mất nhiều thờigian quá có thể con tôi trượt đại học. Giải bài toán này, chúng tôi đã có sựkết hợp rất tốt với giáo viên các bộ môn Toán Lý Hóa: chỉ dạy kiến thức mớikhi có đầy đủ học sinh cả lớp, dạy ôn luyện khi vắng mặt đội tuyển. Đặc biệtkhi kết thúc đội tuyển quốc gia lớp 12 chúng tôi có nhờ được những giáoviên Toán Lý Hóa rất kinh nghiệm bồi dưỡng riêng cho học sinh đội tuyển.Kết quả của nhiều khóa, học trò sau khi có giải quốc gia và sau khi thi chọnđội tuyển quốc tế trở lại thi đại học vẫn đạt điểm 24 trở lên khiến cho phụhuynh rất có niềm tin và ủng hộ hoàn toàn việc con mình theo học đội tuyển.

2. Những bài toán nảy sinh không giống ai:Ngay từ khóa đầu tiên làm việc với đội tuyển tin tôi nhận thấy: theo

được đội tuyển tin đều là các học trò có ý chí hơn người, và phần đông làhoàn cảnh gia đình khó khăn. Vậy việc giải bài toán tìm kinh phí cho học trò

Page 187: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

188

giỏi mà không có điều kiện kinh tế thật sự là việc phải làm thường kỳ. Vậy làngay từ đầu khóa học tôi đã tuyên bố trước toàn bộ phụ huynh của lớp: sốtiền đóng học thêm hàng tháng của lớp được trích lại một suất và góp lại, chođến khi thành lập đội tuyển nếu có học sinh khó khăn đặc biệt thì sẽ dùngkhoản đó để hỗ trợ, nếu không có trò khó khăn số tiền góp được sẽ chia đềuđể hỗ trợ đội tuyển chung. Không phân biệt trước đó là học trò nào. Tất cảphụ huynh đều rất ủng hộ. Điều này tới nay thì không còn quá quan trọngnữa bởi sự hỗ trợ kinh phí từ nhà trường là rất tốt. Còn trong những nămtrước đây quả là “hũ gạo tiết kiệm” vô cùng hữu ích.

3. Truyền thống của giáo viên và học sinh môn tin học.Từ người khởi đầu cho đến đội ngũ giáo viên ngày hôm nay chúng tôi

luôn đoàn kết chung sức vì việc chung của đội tuyển Hải Phòng, vì tương laicủa các học trò tham gia đội tuyển. Giáo viên mới vào được hỗ trợ tài liệu,kèm cùng làm trong nhiều công việc đội tuyển nên thích nghi công việc rấtnhanh.

Sau mỗi năm học tài liệu học tập của mỗi khóa lại được học trò và cácthày cô dẫn đội thu thập biên tập lại thành một hệ thống để giao lại cho họctrò và thày cô lớp sau. Cho đến giờ chúng tôi vẫn còn lưu giữ hệ thống tàiliệu, bài tập của học trò từ năm 1999 – 2000 để làm tài liệu tham khảo rất tốtcho học sinh khối 10 và học sinh đội tuyển.

IV. Lời kết:

Không gì có sức thuyết phục bằng các con số:

Con số học sinh đội tuyển tin cũng vẫn khẳng định được vị trí dẫn đầutrong các hoạt động ngoại khóa.

Con số học sinh đội tuyển hàng năm được giải với tỷ lệ cao.

Con số học sinh đội tuyển đạt kết quả tốt trong kỳ thi đại học.

Con số học sinh đội tuyển khẳng định được mình trong top đầu củacác trường đại học.

Con số học sinh đội tuyển giành được học bổng để đi du học.

Con số học sinh đội tuyển ra trường có việc làm thuận lợi, thu nhậptốt.

Đó là những dấu hiệu rất thuyết phục học sinh Hải Phòng tham gia độituyển tin và cũng là những ý nghĩa tuyệt vời mà mỗi giáo viên dạy đội tuyểncảm nhận được ý nghĩa của công việc mình đang làm.

Page 188: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

189

Những khó khăn của học sinh và giáo viên môn tin học trong bối cảnhchung từ trước tới nay luôn là vấn đề băn khoăn của các thày cô giáo. Songnhìn thấy việc mang lại cho các em cơ hội học tập, cơ hội đạt giải Tin sẽmang lại chìa khóa giúp các em có nhiều cơ hội tốt trong tương lai đó lại làđộng lực cho mỗi thày cô giáo chúng ta tiếp tục làm việc tiếp tục cống hiếncho môn Tin học chuyên trong trường phổ thông ngày càng phát triển.

Page 189: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

190

PHƯƠNG PHÁP DẠY HỌC MÔN TIN HỌC CHUYÊN

Trường THPT Chuyên Hùng Vương

I.ĐẶT VẤN ĐỀ:

Môn tin học là một môn học mới trong hệ thống giáo dục phổ thống củanước ta tuy nhiên sức hút của môn học này chưa đủ mạnh để có thể gây hứngthu hay ham thích trong học sinh.

Chỉ có một bộ phận nhỏ học sinh có tư chất và có lòng say mê thực sựlà theo đuổi môn học, còn đại đa số các học sinh ở lớp chuyên tin rất ngạihọc học môn tin, rất ngại phải lập trình.

Qua 3 năm giảng dạy tại lớp chuyên Tin tôi đã nhận thấy có những lýdo chính khiến môn tin học chưa hấp dẫn được phần lớn học sinh bởi:

Thứ nhất:Môn tin không phải môn thi đại học, cũng không phải mônthi tốt nghiệp đây là nguyên nhân hàng đầu khiến học sinh không hứng thúvới môn Tin. Đa số học sinh chuyên tin thi vào lớp chuyên Tin để đượchưởng chế độ giáo dục của trường chuyên chứ không phải tâm huyết vớimôn học.

Thứ hai: Khác với các môn học truyền thống Toán, Lý, Hóa…học sinhcó thể tự học bất kì ở đâu ở nhà, ở trường chỉ cần quyển sách và giấy nháp vìvậy thời gian tự học của các em là rất nhiều. Việc học tốt môn tin gắn liềnvới việc phải có trang thiết bị và thời gian thực hành tương ứng điều này rấtkhó bởi ngoài thời gian học tập và thực hành hiếm hoi trên trường khôngphải gia đình em nào cũng có điều kiện để sắm cho các em một giàn máy vitính để gia tăng thời gian tự học của các em. Những ai đã từng dạy học sinhgiỏi hẳn điều biết ngoài việc học tập từ thầy cô bạn bè thì việc tự học củahọc sinh giỏi mới là chìa khóa chính dẫn đến thành công của công tác đàotạo bồi dưỡng học sinh giỏi.

Thứ ba: Môn tin học nói chung và lập trình nói riêng là môn học rấtmới cách thức học và tư duy học có khác với các môn truyền thống điều nàydẫn đến tâm lý e ngại rồi tự ti của học sinh khi đối mặt với các bài toán tindù đơn giản nhất.

Page 190: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

191

Thứ tư: Nguồn tài liệu phục vụ môn học quá ít. Bản thân tôi là mộtgiáo viên qua 4 năm đi dạy bằng rất nhiều cách thu thập từ trên mạng, sáchbáo, mua CD, xin bạn bè, các thầy cô tôi vẫn thấy còn quá ít để dạy cho họcsinh. Chủ yếu các tài liệu chỉ nêu đề bài, rồi cho code, sách nào kỹ nữa thìcho test chứ những tài liệu mang tính định hướng làm bài, phân tích thuậttoán rất ít. So với số lượng tài liệu của những môn học truyền thống thì tàiliệu để học chuyên tin thật sự quá ít. Điều này là trở ngại rất lớn đối với họcsinh và giáo viên.

Thứ năm: Đội ngũ giáo viên giảng dạy thực sự là thiếu và còn yếu vềchuyên môn điều này cũng dễ lý giải bởi môn tin học là môn học mới giáoviên được đào tạo về tin học rất ít chủ yếu là các giáo viên dạy từ toán sang.Bản thân tôi là giáo viên được đào tạo bài bản về tin học nhưng khi tiếp nhậnchương trình dạy chuyên tin tôi cũng thấy rất choáng ngợp. Tôi phải tự họcrất nhiều, học để mình hiểu, rôi học để giảng lại cho học sinh hiểu, thực sựrất vất vả và khó khăn, bởi có những vấn đề mình chưa từng nghe tới hoặccũng có nghe tới nhưng chỉ là các tiêu đề mà thôi.

II. GIẢI QUYẾT VẤN ĐỀ:

Từ những vấn đề nêu trên tôi mạnh dạn đưa ra kiến nghị của cá nhângiúp giải quyết những khó khăn trên với mục đích mong môn tin học thực sựtrở thành môn học được học sinh yêu thích, thành môn học chủ lực xứngđáng với vai trò tầm quan trọng mà tin học đem lại cho xã hội hiện đại ngàynay.

Thứ nhất:Tôi chưa mơ ước môn tin học trở thành môn thi đại học bởitôi biết việc tổ chức thi đại học đối với môn tin rất khó thực hiện. Nhưngchúng ta hãy thắt chặt việc học môn tin trong trường phổ thông ví dụ songsong với việc dạy học chúng ta tổ chức các cuộc thi lấy chứng chỉ cuối cấpvà phải có chứng chỉ đó học sinh mới được thi tốt nghiệp và đại học. Tôithiết nghĩ bằng hình thức như vậy sẽ thúc đẩy việc dạy và học môn tin mộtcách tích cực hơn. Để môn tin thực sự trở thành môn học của tất cả các họcsinh chứ không phải chỉ tập trung vào một nhóm thi học sinh giỏi. Khi đã cómột lượng đông đảo học sinh tham gia thì tôi thiết nghĩ việc chọn được họcsinh giỏi sẽ dễ dàng hơn.

Thứ hai:Tôi mong muốn các cấp lãnh đạo quan tâm hơn nữa đặc biệtvề vấn đề tăng cường trang thiết bị, máy vi tính, dành những ưu tiên đặc

Page 191: HỘI THẢO GIÁO VIÊN CÁC TRƯỜNG THPT CHUYÊNs1.downloadmienphi.net/file/downloadfile6/209/1381735.pdf · Chuyên năm qua đã định hướng lại một cách rõ ràng

192

quyền cho lớp chuyên Tin, như phải đảm bảo mỗi em một máy tính với thờigian sử dụng không khống chế.

Thứ ba: Theo kinh nghiệm giảng dạy của tôi trong 4 năm qua tôi nhậnthấy đây là môn học mới với cách học và cách tư duy mới, học sinh rất khókhăn trong việc tiếp cận . Bởi vậy bản thân giáo viên chúng ta cũng phảibình tĩnh, không nóng vội nên đặt ra những mục tiêu giảng dạy thật thấptrong các bài học đầu tiên để đảm bảo học sinh không bị chán nản.

Thứ tư:

Việc gia tăng các tài liệu cho học sinh giỏi là việc tất yếu. Theo tôi tàiliệu viết nên có tính hệ thống hơn, nên biên soạn các bài tập theo chủ đề từdễ đến khó, để kể cả các học sinh và giáo viên mới tiếp cận cũng dễ nắm bắt.

Thứ năm:

Bộ giáo dục nên tổ chức thường xuyên các đợt tập huấn để giáo viên cóthể được học tập và trao đổi nâng cao trình độ chuyên môn.

Trên đây là những kinh nghiệm và tâm huyết của cá nhân tôi về việcgiảng dạy môn tin chuyên trong trường phổ thông. Rất mong những ý kiếnnày sẽ có tác dụng để môn thúc đẩy sự phát triển của môn tin học.