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

Giúp học sinh lựa chọn và cài đặt chương trình tối ưu khi giải một số dạng bài tập về dãy con nhằm nâng cao chất lượng

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

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ
TRƯỜNG THPT ĐẶNG THAI MAI

SÁNG KIẾN KINH NGHIỆM

ĐỀ TÀI
GIÚP HỌC SINH LỰA CHỌN VÀ CÀI ĐẶT CHƯƠNG TRÌNH
TỐI ƯU KHI GIẢI MỘT SỐ DẠNG BÀI TẬP VỀ DÃY CON
NHẰM NÂNG CAO CHẤT LƯỢNG HỌC SINH GIỎI
MÔN TIN HỌC Ở TRƯỜNG THPT

Người thực hiện: Hoàng Thị Mai
Chức vụ: Giáo viên
SKKN thuộc lĩnh vực: Tin học

THANH HOÁ NĂM 2016


1. MỞ ĐẦU
1.1. Lý do chọn đề tài
Cùng với công tác bồi dưỡng học sinh thi Đại học – Cao đẳng thì công tác
bồi dưỡng học sinh giỏi là một công tác mũi nhọn của nhà trường. Thông qua
kết quả học sinh giỏi phần nào khẳng định được vị thế của trường so với các
trường bạn trong huyện nói riêng và trong tỉnh nói chung.
Tuy nhiên chất lượng học sinh giỏi môn Tin học của trường từ năm học
2013 – 2014 trở về trước còn thấp, chưa có học sinh nào đạt được giải học sinh
giỏi môn Tin học cấp tỉnh, mặc dù một số năm vẫn có học sinh tham gia thi.
Chất lượng học sinh giỏi môn Tin học còn thấp như vậy, phần vì năng lực học
sinh (do chất lượng đầu vào của học sinh thấp) phần vì phương pháp giảng dạy
của giáo viên chưa phù hợp. Do đó việc nâng cao chất lượng học sinh giỏi môn
Tin học là cần thiết và cấp bách nhằm góp thêm vào thành tích chung của nhà


trường.
Mặt khác, trong quá trình dạy bồi dưỡng học sinh giỏi tôi gặp rất nhiều bài
toán về dãy con. Đây là dạng bài tập khó thường xuất hiện trong các đề thi học
sinh giỏi môn Tin học. Rất nhiều học sinh khi gặp dạng bài tập này bị mất điểm
hoặc điểm không cao. Nguyên nhân có thể nhiều nhưng trong đó có hai nguyên
nhân cơ bản là: chương trình cho kết quả output sai hoặc chương trình cho kết
quả output đúng với các bộ input có dữ liệu nhỏ nhưng với những bộ input có dữ
liệu lớn thì chương trình chạy quá thời gian quy định là 1giây/1test (mặc dù kết
quả output vẫn đúng).
Trên thực tế đã có một số tài liệu đề cập đến các bài tập về dãy con, nhưng
các tài liệu này mới chỉ đưa ra thuật toán và chương trình giải một số bài tập cụ
thể làm ví dụ minh họa cho một kỹ thuật lập trình nào đó khi nghiên cứu mà
chưa khái quát dạng, chưa phân tích sâu cách tư duy, cách lựa chọn và cài đặt
chương trình tối ưu. Các chương trình mà một số tài liệu đưa ra rất khó hiểu và
phức tạp không phù hợp năng lực học sinh Trường THPT Đặng Thai Mai. Khi
nghiên cứu các tài liệu này, không chỉ học sinh mà ngay cả giáo viên còn lúng
túng, mơ hồ, áp dụng một cách máy móc mà chưa biết nên chọn cách làm nào?
Cách làm nào tối ưu hơn?
Với mong muốn giúp học sinh giải quyết tốt hơn các bài tập về dãy con và
hiểu biết sâu sắc hơn cách giải các bài tập này, tôi đã dày công nghiên cứu, phân
dạng các bài tập dãy con, trăn trở để tìm ra nhiều cách làm khác nhau, đánh giá
độ phức tạp, đo thời gian thực hiện chương trình, để so sánh tìm ra chương trình
tối ưu nhất và dễ hiểu nhất trong các chương trình đã đưa ra. Từ đó nâng cao
chất lượng bồi dưỡng học sinh giỏi môn Tin học.
Từ những lý do trên tôi đã mạnh dạn trình bày sáng kiến kinh nghiệm:
“Giúp học sinh lựa chọn và cài đặt chương trình tối ưu khi giải một số dạng bài
tập về dãy con nhằm nâng cao chất lượng học sinh giỏi môn Tin học ở trường
THPT”.
1.2. Mục đích nghiên cứu
Đề tài này nghiên cứu nhằm giúp học sinh giải quyết tốt các bài toán về dãy

2


con từ đó đổi mới cách tư duy lập trình, để khi đứng trước một bài toán cần giải
quyết ngoài việc tìm ra thuật toán để cài đặt chương trình thì học sinh sẽ biết
cách so sánh, đánh giá hiệu quả của thời gian thực hiện chương trình (hay còn
gọi là độ phức tạp của thuật toán) và lựa chọn được chương trình phù hợp nhằm
nâng cao chất lượng học sinh giỏi.
1.3. Đối tượng nghiên cứu
Sáng kiến kinh nghiệm có đối tượng nghiên cứu là các bài toán về dãy con,
được nghiên cứu ở nhiều cách làm, xét trên nhiều phương diện như: độ phức tạp,
kết quả output, thời gian thực hiện chương trình.
1.4. Phương pháp nghiên cứu
Để trình bày sáng kiến kinh nghiệm này, tôi đã sử dụng phối kết hợp nhiều
phương pháp như: nghiên cứu tài liệu, thuyết trình, quan sát, điều tra cơ bản,
thực nghiệm so sánh, phân tích kết quả thực nghiệm, … phù hợp với môn học
thuộc lĩnh vực Tin học.

3


2. NỘI DUNG NGHIÊN CỨU
2.1. Cơ sở lý luận
Nghị quyết hội nghị Trung ương VIII khóa XI chỉ đạo: “Giáo dục và đạo
tạo là Quốc sách hàng đầu, là sự nghiệp của Đảng và Nhà nước và của toàn dân.
Đầu tư cho giáo dục là đầu tư phát triển, được ưu tiên đi trước cho các chương
trình, kế hoạch phát triển KT-XH; phát triển giáo dục và đạo tạo là nâng cao dân
trí, đạo tạo nhân lực, bồi dưỡng nhân tài. Chuyển mạnh quá trình giáo dục từ chủ
yếu trang bị kiến thức sang phát triển toàn diện năng lực và phẩm chất người
học. Học đi đôi với hành, lý luận gắn với thực tiễn, giáo dục nhà trường kết hợp

với giáo dục gia đình và giáo dục xã hội”.
Nghị quyết hội nghị Trung ương VIII khóa XI đề ra mục tiêu: “Đối với giáo
dục phổ thông tập trung phát triển trí tuệ, thể chất, hình thành phẩm chất, năng
lực công dân, phát hiện và bồi dưỡng năng khiếu, định hướng nghề nghiệp cho
học sinh. Nâng cao chất lượng giáo dục toàn diện, chú trọng giáo dục lý tưởng
truyền thống đạo đức, lối sống, ngoại ngữ, tin học, năng lực và kỹ năng thực
hành, vận dụng kiến thức vào thực tiễn, phát triển khả năng sáng tạo và tự học,
khuyến khích học tập suốt đời, hoàn thành đào tạo giáo dục phổ thông giai đoạn
sau 2015”.
Căn cứ vào mục tiêu của môn Tin học, là phải cung cấp những tri thức cơ
bản, làm nền tảng để học sinh có thể tiếp tục đi sâu vào tìm hiểu và xây dựng
khoa học Tin học hoặc tiếp thu những tri thức của các lĩnh vực kĩ thuật công
nghệ tiên tiến, nhất là các lĩnh vực của công nghệ thông tin.
Môn Tin học, cũng như mọi môn học khác, căn cứ vào mục tiêu trên để
xác định ra nhiệm vụ cụ thể của môn học, tổ chức hoạt động đào tạo góp phần
thực hiện mục tiêu giáo dục mà Đảng và nhà nước đề ra.
Nếu học sinh thực hiện tốt việc lựa chọn và cài đặt chương trình tối ưu khi
giải các bài tập về dãy con nói riêng và các bài tập lập trình nói chung thì chất
lượng học sinh giỏi sẽ được nâng cao.
2.2. Thực trạng
2.2.1. Giới thiệu khái quát về trường
Trường THPT Đặng Thai Mai được thành lập ngày: 20/08/2001, theo quyết
định số: 2109/QĐ-UB của Chủ tịch UBND Tỉnh Thanh Hoá. Trường nằm ngay
trên đường quốc lộ 1A, thuộc km 12 từ thành phố Thanh Hóa xuống phía Nam,
thuộc địa bàn xã Quảng Bình, huyện Quảng Xương, tỉnh Thanh Hóa, nơi đa số
phụ huynh học sinh làm nông nghiệp, điều kiện kinh tế còn gặp nhiều khó khăn.
Các em học sinh ít có điều kiện tiếp xúc với máy tính ở nhà. Ban đầu trường
hoạt động theo mô hình trường bán công, chất lượng đầu vào của học sinh thấp,
chủ yếu là học sinh trung bình, yếu. Mặc dù ngày 31 tháng 5 năm 2010 chủ tịch
tỉnh Thanh hóa có quyết định chuyển đổi trường THPT Đặng Thai Mai sang

hình thức công lập nhưng chất lượng đầu vào của học sinh vẫn còn thấp so với
các trường trong huyện.
Trường hiện có 25 lớp, đã trang bị 2 phòng học thực hành Tin học, có lắp
đặt máy chiếu, đảm bảo cơ sở vật chất đầy đủ cho việc học môn Tin học của nhà
4


trường.
Trong những năm gần đây nhà trường cũng đã có nhiều thành tích nổi bật
như: Năm học 2013 – 2014 được UBND Tỉnh Thanh Hóa tặng bằng khen - QĐ
số 3645/QĐ- UBND, ngày 30/10/2014. Năm học 2014 - 2015 đón cờ thi đua của
UBND Tỉnh về đơn vị dẫn đầu, QĐ số 3335/QĐ UBND tỉnh Thanh Hoá ngày
1/9/2015,...
Môn Tin học là môn học đặc thù có nhiều kiến thức khó như lập trình
pascal ở lớp 11 (đây là kiến thức thi học sinh giỏi tỉnh môn Tin học) nhưng
thường bị xem nhẹ, bị xem là “môn phụ”. Học sinh – phụ huynh chưa mặn mà,
chưa quan tâm đúng mực tới môn học nên việc lựa chọn và bồi dưỡng học sinh
giỏi là vô cùng khó khăn.
2.2.2 Thực trạng trước khi nghiên cứu
Năm 2013 – 2014 tôi có phối hợp cùng một giáo viên khác tham gia công
tác bồi dưỡng học sinh giỏi tỉnh môn Tin học, cũng là năm đầu tiên tôi tham gia
công tác bồi dưỡng học sinh giỏi, việc dạy đội tuyển của tôi chủ yếu dựa trên
những kiến thức cơ bản của sách giáo khoa, chưa chú trọng nhiều đến cải tiến
chương trình tối ưu hơn để chương trình chạy nhanh hơn và chủ yếu là định
hướng cho học sinh tìm ra được thuật toán (cách làm) để chương trình cho ra
được kết quả mà thôi.
Chính vì vậy khi giải quyết các bài toán về dãy con nói riêng và các bài tập
lập trình pascal khác nói chung, học sinh và ngay cả giáo viên thường chỉ làm
việc với các bộ input có dữ liệu nhỏ dễ nhìn thấy kết quả output và thường
không xét đến trường hợp input đặc biệt hay các input có dữ liệu lớn. Dẫn đến bị

mất điểm trong bài thi học sinh giỏi.
Đối với thi học sinh giỏi, dù kết quả output của 2 thí sinh có giống hệt nhau
với cùng một bộ input, nhưng việc chênh lệch về thời gian quyết định thí sinh có
thể chiến thắng hay thất bại (yêu cầu thời gian xử lí chương trình không quá 1
giây/1 test).
Trong các kì thi học sinh giỏi gần đây, với cấu trúc đề 3 câu tương ứng với
số điểm 6, 7, 7, trong đó chỉ có không quá 50% các dữ liệu input là nhỏ vừa tầm
thì việc thí sinh dù có làm hết cả 3 câu trong đề thì nguy cơ thất bại vẫn rất cao.
Bảng điểm các lần thi khảo sát chất lượng học sinh giỏi về chuyên đề dãy
con (do tôi tự tổ chức) năm học 2013 – 2014 khi chưa thực hiện đề tài:
Họ tên
Điểm lần 1
Điểm lần 2
Điểm lần 3
Điểm lần 4
Phạm Hà Uyên
2/10
3/10
2/10
3/10
Lê Đình Miền
3/10
3/10
4/10
4/10
Do đó kết quả học sinh giỏi năm 2013- 2014 chưa được như mong muốn,
có 2 em học sinh tham gia thi học sinh giỏi Tin của trường thất bại không có em
nào đạt giải (mặc dù khi đi thi về các em rất phấn khởi vì nghỉ mình làm bài tốt,
đúng vậy bài làm các em đều cho kết quả đúng trong khoảng thời gian cho phép
nhỏ hơn 1 giây nhưng với bộ input có dữ liệu nhỏ còn bộ input có dữ liệu lớn thì

bài làm vẫn cho kết quả đúng nhưng thời gian chạy chương trình quá 1giây,
nghĩa là bộ test có dữ liệu lớn các em bị mất điểm).
5


Vấn đề đặt ra, là làm thế nào để lấy được điểm với các bộ input có dữ liệu
lớn. Muốn vậy cần phải lựa chọn và cài đặt được chương trình hiệu quả (tối ưu).
Chương trình hiệu quả là chương trình giải quyết được những bộ input có dữ
liệu lớn, chính xác, dung lượng sử dụng bộ nhớ nhỏ, thời gian thực chương trình
ngắn,... Nhưng trong phạm vi sáng kiến kinh nghiệm của mình, tôi chỉ nghiên
cứu về tiêu chí thời gian thực hiện chương trình để lựa chọn chương trình tối ưu,
đây là tiêu chí quan trọng nhất và được người ta quan tâm nhiều. Ngoài ra, tôi
cũng ưu tiên lựa chọn chương trình ngắn gọn, dễ hiểu phù hợp với năng lực học
sinh trường tôi.
Thời gian thực hiện chương trình không chỉ phụ thuộc vào thuật toán mà
còn phụ thuộc vào cấu hình máy tính, kĩ xảo người lập trình, kích thước và tính
chất của dữ liệu vào,...Để cụ thể và tường minh hơn tôi có sử dụng phần mềm
Themis để đo thời gian thực hiện của các chương trình với các bộ test cụ thể (có
file test kèm theo). Các kết quả được tôi thử nghiệm trên máy tính laptop ASUS,
Ram 2GB, Processor AMDE-450 APU 1.65HZ.
2.3. Các biện pháp sử dụng để giải quyết vấn đề
2.3.1. Cơ sở lý thuyết
2.3.1.1. Dãy con liên tiếp
Dãy con liên tiếp là dãy gồm các phần tử liên tiếp thuộc một dãy cho trước
(dãy mẹ).
Ví dụ: Cho dãy A gồm 4 số nguyên {3,1,2,-6}. Dãy số {2}; {1,2}; {3,1,2};
{3,1,2,-6}; … được gọi là các dãy con liên tiếp của dãy A.
2.3.1.2. Dãy con có thể chọn không liên tiếp
Dãy con có thể chọn không liên tiếp là dãy thu được sau khi xóa một số
phần tử (có thể không xóa phần tử nào) của một dãy cho trước (dãy mẹ) và giữ

nguyên thứ tự các phần tử còn lại trong dãy.
Ví dụ: Cho dãy B gồm 5 số nguyên {3,1,2,-6, 9}. Dãy số {2}; {1,2}; {3,2};
{3,2,-6}; {3,1,2,-6,9}; … được gọi là các dãy con có thể chọn không liên tiếp
của dãy A.
2.3.1.3. Độ phức tạp của thuật toán
Giả sử ta có hai thuật toán P1 và P2 với thời gian thực hiện tương ứng là
T1(n) = 100n2 (với tỷ suất tăng là n2) và T2(n) = 5n3 (với tỷ suất tăng là n3). Khi n
> 20 thì T1 < T2. Sở dĩ như vậy là do tỷ suất tăng của T 1 nhỏ hơn tỷ suất tăng của
T2. Như vậy một cách hợp lý là ta xét tỷ suất tăng của hàm thời gian thực hiện
chương trình thay vì xét chính bản thân thời gian thực hiện.
Cho một hàm T(n), T(n) gọi là có độ phức tạp f(n) nếu tồn tại các hằng C,
N0 sao cho T(n) ≤ Cf(n) với mọi n ≥ N 0 (tức là T(n) có tỷ suất tăng là f(n)) và kí
hiệu T(n) là O(f(n)) (đọc là “ô của f(n)”).
Các hàm thể hiện độ phức tạp có các dạng thường gặp sau: log2n, n, nlog2n,
2
3
n , n , 2n, n!, nn.
Trong cách viết, ta thường dùng logn thay thế cho log2n cho gọn.
Khi ta nói đến độ phức tạp của thuật toán là ta nói đến hiệu quả thời gian
thực hiện chương trình nên có thể xem việc xác định thời gian thực hiện chương
6


trình chính là xác định độ phức tạp của thuật toán.
2.3.2. Biện pháp lựa chọn và cài đặt chương trình tối ưu khi giải một số
dạng bài tập về dãy con
Đối với mỗi dạng bài tập về dãy con tôi đưa ra một bài toán ví dụ, mỗi bài
toán ví dụ tôi trình bày từ 2 hoặc 3 cách (cả cách làm của học sinh và cách làm
tôi định hướng cho học sinh làm). Với phương châm của tôi “ mưa dầm thấm
lâu” tôi ko hướng dẫn học sinh cách làm tối ưu ngay mà khi phát vấn một dạng

bài tập mới mà tôi yêu cầu học sinh làm theo các trình tự sau:
Bước 1: Xác định bài toán
Bước 2: Suy nghĩ tìm ra thuật toán, viết chương trình (trên môi trường Free
Pascal), tính độ phức tạp (Có thể nhiều cách).
Bước 3: Trao đổi cách làm của mình với bạn để tìm cái hay cái dở.
Bước 4: Sử dụng phần mềm Themis-chấm bài tự động để chấm cách làm
của mình (với 10 bộ test giáo viên đã xây dựng sẵn, mỗi bộ test cấu hình là 1
điểm, thời gian chạy không quá 1 giây).
Bước 5: Nhận xét sự tối ưu của thuật toán.
Bước 6: Giáo viên định hướng cách làm tối ưu hơn (nếu có).
Bước 7: Sử dụng phần mềm Themis để chấm tất cả các cách đã viết chương
trình.
Bước 8: Dựa vào kết quả, lựa chọn chương trình có độ phức tạp nhỏ nhất,
thời gian thực hiện mỗi test nhỏ nhất và chương trình ngắn gọn dễ hiểu nhất.
Bước 9: Lập trình giải các bài tập tương tương với cách đã lựa chọn.
2.3.2.1. Bài tập về dãy con liên tiếp
2.3.2.1.1. Dạng 1: Các dãy con không chung nhau bất kỳ phần tử nào của
dãy mẹ
Các dãy con không chung nhau bất kỳ phần tử nào của dãy mẹ nghĩa là
những phần tử của dãy mẹ đã thuộc dãy con thỏa mãn này thì không thuộc các
dãy con thỏa mãn khác.
Ví dụ: Dãy mẹ gồm 7 phần tử {2, 5, -9, -6, 0, -7, -5}. Dãy con {-9, -6}; {7, -5} là các dãy con liên tiếp không chung nhau bất kỳ phần tử nào của dãy mẹ.
Lưu ý: Dạng bài tập này áp dụng cho cả trường hợp một phần tử đầu của dãy
này trùng với một phần tử cuối của dãy kia.
2.3.2.1.1.1. Bài toán cơ bản: Cho một dãy A gồm N số nguyên (hoặc số thực)
{a1, a2,…, aN}. Dãy con ai, ai+1,…, aj (1≤i≤j≤N) là dãy được tạo từ các phần tử
liên tiếp của dãy A bắt đầu từ phần tử i và kết thúc ở phần tử j. Hãy tìm độ dài
dãy con, số lượng dãy con, liệt kê chỉ số các dãy con, liệt kê giá trị các phần tử
dãy con thõa mãn một điều kiện nào đó. (Độ dài dãy con là số lượng phần tử dãy
con)

Để giải dạng bài tập này ta có thể sử dụng nhiều thuật toán như: thuật toán
vét cạn các dãy con hoặc duyệt qua các phần tử của dãy hoặc sử dụng phương
pháp quy hoạch động. Đối với dạng bài tập này tôi định hướng cho học sinh lựa
chọn thuật toán duyệt qua các phần tử của dãy hoặc quy hoạch động.
 Mô hình thuật toán:
7


Cách 1. Sử dụng phương pháp duyệt qua các phần tử của dãy:
- Duyệt qua tất cả các phần tử của dãy nếu:
+ Thỏa mãn điều kiện, tăng độ dài thêm 1, ngược lại:
• Nếu dãy con đang xét cần lưu thì: lưu lại độ dài, chỉ số đầu của dãy,
xác định lại độ dài, chỉ số đầu của dãy mới.
• Nếu dãy con đang xét không cần lưu thì: lưu lại độ dài, chỉ số đầu
của dãy mới.
Cách 2. Sử dụng phương pháp quy hoạch động. (Đây là cách tôi định hướng
cho học sinh làm)
- Gọi f[i] là độ dài dãy con thỏa mãn điều kiện có phần tử cuối là a[i], i=1..n
- Gán giá trị độ dài dãy con trong trường hợp đơn giản: f[0]:=0; f[1]:=1.
- Tính f[i] nhờ các giá trị bài toán con đã tính từ trước như f[i-1], f[i-2],...
- Kết quả bài toán là sự tổng hợp kết quả từ các bài toán con f[i] (i=1,2,...,n)
2.3.2.1.1.2. Bài toán ví dụ
Cho một dãy A gồm N số nguyên {a1, a2,…, aN}. Dãy con ai, ai+1,…, aj
(1≤i≤j≤N) là dãy được tạo từ các phần tử liên tiếp của dãy A bắt đầu từ phần tử i
và kết thúc ở phần tử j.
Yêu cầu: Hãy tìm độ dài và liệt kê giá trị mỗi phần tử của dãy con dài nhất tạo
thành cấp số cộng có công sai d.
Dữ liệu vào: File văn bản dayconcsc.inp gồm:
- Dòng đầu ghi giá trị N, d (2≤N≤10000; 0≤d≤500 ).
- Dòng sau gồm N số nguyên{a1, a2,…, aN} (-106≤ai≤106) mỗi số cách

nhau một dấu cách.
Dữ liệu ra: File văn bản dayconcsc.out gồm
- Dòng đầu ghi độ dài dãy con và số dãy con thỏa mãn.
- Dòng tiếp theo ghi giá trị các phần tử dãy con.
(Chú ý: Nếu không có dãy con nào thỏa mãn thì ghi 0)
Ví dụ:
Dayconcsc.inp
Dayconcsc.out
Cách 1: Khi gặp
94
32
bài toán này thông
1 7 2 6 10 6 1 5 9
2 6 10
thường học sinh
159
sẽ
sử
dụng
phương pháp vét cạn các dãy con như sau:
 Mô hình thuật toán:
For i:=1 to n do
hoặc For k:=1 to n do
For j:=1 to n-i+1 do
For j:=1 to n-k+1 do
Begin
begin
{Xét tất cả các dãy con bắt đầu
j:=i+k-1;
từ vị trí i có độ dài j}

{Xét tất cả các dãy con
end;
bắt đầu từ vị trí i đến vị trí j với độ dài
k}
end;
8


 Cài đặt chương trình:
Program c1_dayconcsc;
Type km=array[0..10001] of longint;
Const fi='dayconcsc.inp'; fo='dayconcsc.out';
Var a,cs:km; dmax,i,j,n,k,d:longint;
Procedure inday(b:km;m,l:longint);
Var i:integer;
Begin for i:=m to m+l-1 do write(b[i],' '); writeln;
End;
Function kt(b:km;m,l:integer):boolean;
Var i:integer;
Begin for i:=m to m+l-2 do
if b[i+1]-b[i]<>d then exit(false); exit(true);
End;
BEGIN
assign(input,fi);reset(input); assign(output,fo);rewrite(output);
readln(n,d); for i:=1 to n do read(a[i]);
{tim do dai va chi so dau day con thoa man}
dmax:=0; k:=0;
for i:=1 to n-1 do
for j:=2 to n-i+1 do
if kt(a,i,j) then

begin
if j>dmax then begin dmax:=j;k:=0; end;
if j=dmax then begin k:=k+1;cs[k]:=i; end;
end;
{in ket qua}
if dmax=0 then write('0')
else begin writeln(dmax,' ',k);
for i:=1 to k do inday(a,cs[i],dmax);
end; close(input); close(output);
END.
Sử dụng phần mềm Themis – chấm bài tự động. Ta đo được thời gian thực
hiện mỗi test cụ thể như sau: (có file test và code kèm theo)
Cách
1

Độ phức Test01
tạp
(giây)
0(n2)

0.1924

Test02
(giây)
0.107
4

Test03
(giây)
0.258

3

Test04
(giây)
0.269
1

Test05
(giây)
6.930
1

Test06
(giây)

Test07
(giây)

Test08
(giây)

Test09
(giây)

Test10
(giây)

89.9473

>100


>100

>100

>100

Với cách này chỉ lấy được 40% số điểm câu này. Vì một số test có dữ liệu
lớn chạy quá thời gian.
Cách 2: Thuật toán duyệt qua các phần tử của dãy mẹ.
 Mô hình thuật toán:
- Khởi tạo: dmax=1; dem=1; dau=1; a[n+1]=a[n]+d+1;k=0;

9


{Biến dmax lưu độ dài max dãy, biến dau lưu giá trị đầu mỗi dãy, biến k lưu
số lượng dãy con thỏa mãn}
- For i:=1 to n do
Nếu a[i+1]-a[i]=d thì tăng biến dem, ngược lại:
Nếu dem>dmax thì begin dmax=dem;k=1;dem=1;cs[k]=dau;dau=i+1;
end, ngược lại:
Nếu dem=dmax thì begin inc(k);cs[k]=dau;dau=i+1;dem=1;
end, ngược lai: begin dem=1; dau=i+1; end;
 Cài đặt chương trình:
Program c2_dayconcsc;
Const fi='dayconcsc.inp'; fo='dayconcsc.out';
Var a,cs:array[0..10001] of longint;dmax,dem,i,j,n,dau,k,d:longint;
BEGIN
assign(input,fi);reset(input);assign(output,fo);rewrite(output);

readln(n,d); for i:=1 to n do read(a[i]);
{tim do dai dmax va chi so dau cac day con thoa man}
k:=0;dmax:=1;dem:=1; dau:=1;a[n+1]:=a[n]+d+1;
For i:= 1 to n do
begin
if a[i+1]-a[i]=d then inc(dem)
else
begin if dem>dmax then
begin dmax:= dem; k:=1;cs[k]:=dau; dem:=1;dau:=i+1; end
else
if dem=dmax then
begin inc(k);cs[k]:=dau;dau:=i+1;dem:=1;end
else begin dem:=1;dau:=i+1;end;
end;
end;
{in ket qua}
if dmax=1 then write(0) else
begin writeln(dmax,' ',k);
for j:=1 to k do
Begin for i:=cs[j] to cs[j]+dmax-1 do write(a[i],' '); writeln;
End;
end;
close(input); close(output);
END.
Sử dụng phần mềm Themis – chấm bài tự động. Ta đo được thời gian thực
hiện mỗi test cụ thể như sau: (có file test và code kèm theo)
Cách
2

Độ phức Test01

tạp
(giây)
0.087
0(n)
1

Test02
(giây)
0.088
7

Test03
(giây)
0.087
1

Test04
(giây)
0.1116

Test05
(giây)
0.091
5

Test06
(giây)

Test07
(giây)


Test08
(giây)

Test09
(giây)

Test10
(giây)

0.0919

0.114

0.1210

0.1335

0.1190

10


Với cách này có thể lấy được 100% số điểm câu này. Tuy nhiên nếu dữ liệu
vào lớn như n=108 thì sẽ có một số test yếu nên không lấy được điểm tối đa.
Cách 3: Dùng quy hoạch động
 Mô hình thuật toán
- Gọi f[i] là độ dài dãy con tạo thành cấp số cộng công sai d có chỉ số cuối
là i.
- Ta dễ dàng nhận thấy bài toán cơ sở : f[1]=1 ;

- Công thức quy hoạch động là :
- Công thức quy hoạch động :
Nếu a[i+1]-a[i]=d thì f[i+1]=f[i], ngược lại f[i+1]=1.
- Kết quả bài toán: Max(f[i+1]) với i=1,2,...,n-1.
 Cài đặt chương trình:
Program c3_dayconcsc;
Const fi='dayconcsc.inp'; fo='dayconcsc.out';
Var a,cs,f:array[0..10001] of longint; dmax,i,n,j:integer; k,d:longint;
BEGIN
assign(input,fi);reset(input);assign(output,fo);rewrite(output);
readln(n,d); for i:=1 to n do read(a[i]);
f[1]:=1; dmax:=0; k:=1;
for i:=1 to n-1 do
begin
if a[i+1]-a[i]=d then f[i+1]:=f[i]+1
else f[i+1]:=1;
if f[i+1]>dmax then begin dmax:=f[i+1];k:=1;cs[k]:=i+1; end
else if f[i+1]=dmax then begin inc(k);cs[k]:=i+1; end;
end;
{in ket qua}
if dmax=1 then write('0')
else begin writeln(dmax,' ',k);
for j:= 1 to k do
begin for i:=cs[j]-dmax+1 to cs[j] do write(a[i],' '); writeln;
end;
end;
close(input); close(output);
End.
Sử dụng phần mềm Themis – chấm bài tự động. Ta đo được thời gian thực
hiện mỗi test cụ thể như sau: (có file test và code kèm theo)

Cách 3

Độ phức Test01
tạp
(giây)
0.083
0(n)
9

Test02
(giây)
0.070
3

Test03
(giây)
0.077
9

Test04
(giây)
0.069
9

Test05
(giây)
0.075
2

Test06

(giây)

Test07
(giây)

Test08
(giây)

Test09
(giây)

Test10
(giây)

0.0797

0.1046

0.1057 0.1162

0.1002

Với cách này có thể lấy được 100% số điểm câu này. Nếu dữ liệu vào lớn
n=108 thì cách này vẫn lấy được điểm tối đa.
So sánh kết quả từ 3 bảng trên và kết quả chấm điểm bài toán ví dụ (của
11


dạng 1) bằng phần mềm Themis của 3 cách trên như sau (mỗi test đúng và thời
gian chạy không quá 1 giây được 1 điểm):


Dễ dàng nhận thấy cách 3 là tối ưu hơn cả mà chương trình ngắn gọn dễ
cài đặt phù hợp với năng lực học sinh trường tôi. Do vậy giải các bài tập dạng
này ta nên lựa chọn cách thứ 3. Cách này có thể lấy được điểm với dãy có số
phần tử lớn lên đến n=108. (Tuy nhiên học sinh có thể lựa chọn cách 2 để giải
quyết bài toán thì cũng lấy được 100% số điểm nếu n<108 ).
2.3.2.1.1.3. Bài toán áp dụng
Bài 1: Cho một dãy A gồm N số nguyên {a 1, a2,…, aN}. Dãy con liên tiếp các
phần tử ai, ai+1,…, aj (1≤i≤j) thỏa mãn điều kiện a icon đơn điệu tăng của dãy A.
Yêu cầu: Hãy tìm độ dài và chỉ số dãy con liên tiếp đơn điệu tăng dài nhất.
Dữ liệu vào: File văn bản daycontang.inp gồm:
- Dòng đầu ghi giá trị N (5≤N≤10000).
- Dòng sau gồm N số nguyên {a1, a2,…, aN} (-106≤ai≤106) mỗi số cách
nhau một dấu cách.
Dữ liệu ra: File văn bản daycontang.out gồm
- Dòng đầu ghi độ dài và số lượng dãy con thỏa mãn.
- Dòng tiếp theo ghi chỉ số các phần tử dãy con.
(Chú ý: Nếu không có dãy con nào thỏa mãn thì ghi 0)
Ví dụ:
Daycontang.inp
Daycontang.out
12
52
5 2 3 8 9 10 8 6 7 11 20 33
23456
8 9 10 11 12
 Thuật toán: Tương tự bài toán ví dụ (của dạng 1) chỉ thay điều kiện:
a[i+1]>a[i]. Áp dụng cách 3 là tối ưu hơn cả.
 Code tham khảo:

{Sử dụng phương pháp quy hoạch động}
Program Daycontang;
Const fi='daycontang.inp'; fo='daycontang.out';
Var a,cs,f:array[0..10001] of longint; dmax,i,n,j:integer; k:longint;
BEGIN
assign(input,fi);reset(input);assign(output,fo);rewrite(output);
12


readln(n); for i:=1 to n do read(a[i]);
f[1]:=1; dmax:=0; k:=1;
for i:=1 to n-1 do
begin
if a[i+1]>a[i] then f[i+1]:=f[i]+1
else f[i+1]:=1;
if f[i+1]>dmax then begin dmax:=f[i+1];k:=1;cs[k]:=i+1; end
else if f[i+1]=dmax then begin inc(k);cs[k]:=i+1; end;
end;
{in ket qua}
if dmax=1 then write('0')
else begin writeln(dmax,' ',k);
for j:= 1 to k do
begin for i:=cs[j]-dmax+1 to cs[j] do write(i,' '); writeln;
end;
end;
close(input); close(output);
End.
Bài 2: Cho một dãy A gồm N số nguyên {a 1, a2,…, aN}. Dãy con ai, ai+1,…, aj
(1≤i≤j≤N) là dãy được tạo từ các phần tử liên tiếp của dãy A bắt đầu từ phần tử i
và kết thúc ở phần tử j.

Yêu cầu: Hãy tìm dãy con liên tiếp có số phần tử dương nhiều nhất.
Dữ liệu vào: File văn bản dayconduong.inp gồm:
- Dòng đầu ghi giá trị N (2≤N≤10000).
- Dòng sau gồm N số nguyên{a1, a2,…, aN} (-106≤ai≤106) mỗi số cách
nhau một dấu cách.
Dữ liệu ra: File văn bản dayconduong.out gồm
- Dòng đầu ghi độ dài dãy con và số lượng dãy con thỏa mãn.
- Dòng tiếp theo ghi giá trị các phần tử dãy con.
(Chú ý: Nếu không có dãy con nào thỏa mãn thì ghi 0)
Ví dụ:
dayconduong.inp
dayconduong.out
9
32
1 3 1 -2 -5 0 1 17 12
131
1 17 12
 Thuật toán: Tương tự bài toán ví dụ áp dụng cách 3 chỉ thay:
- Điều kiện: a[i]>0; Khởi tạo: f[0]=0; dmax=0;
- Công thức quy hoạch động: Nếu a[i]>0 thì f[i]=f[i-1]+1, ngược lại f[i]=0;
 Code tham khảo:
Program Dayconduong;
Const fi='dayconduong.inp'; fo='dayconduong.out';
Var a,cs,f:array[0..10001] of longint; dmax,i,n,j:integer; k:longint;
13


BEGIN
assign(input,fi);reset(input);assign(output,fo);rewrite(output);
readln(n);

for i:=1 to n do read(a[i]);
f[0]:=0; dmax:=0; k:=1;
for i:=1 to n do
begin
if a[i]>0 then f[i]:=f[i-1]+1
else f[i]:=0;
if f[i]>dmax then begin dmax:=f[i];k:=1;cs[k]:=i; end
else if f[i]=dmax then begin inc(k);cs[k]:=i; end;
end;
{in ket qua}
if dmax=0 then write('0')
else begin writeln(dmax,' ',k);
for j:= 1 to k do
begin for i:=cs[j]-dmax+1 to cs[j] do write(a[i],' '); writeln;
end;
end;
close(input); close(output);
End.
2.3.2.1.2. Dạng 2: Các dãy con có thể chung nhau phần tử của dãy mẹ
Các dãy con có thể chung nhau phần tử của dãy mẹ nghĩa là những phần
tử của dãy mẹ đã thuộc dãy con thỏa mãn này thì vẫn có thể thuộc hoặc không
thuộc các dãy con thỏa mãn khác.
Ví dụ: Dãy mẹ gồm 7 phần tử {1,2,3,6,9,-6,8}. Dãy con {1,2,3};
{1,2,3,6}; {-6,8} là các dãy con có thể chung nhau phần tử của dãy mẹ.
2.3.2.1.2.1. Bài toán cơ bản
Cho một dãy A gồm N số nguyên {a1, a2,…, aN}. Dãy con ai, ai+1,…, aj
(1≤i≤j≤N) là dãy được tạo từ các phần tử liên tiếp của dãy A bắt đầu từ phần tử i
và kết thúc ở phần tử j. Tìm các dãy con thõa mãn một điều kiện nào đó.
Để giải dạng bài tập này ta có thể sử dụng thuật toán vét cạn các dãy con
hoặc sử dụng phương pháp quy hoạch động. Đối với dạng bài tập này tôi định

hướng cho học sinh lựa chọn thuật toán quy hoạch động.
 Mô hình thuật toán:
- Gọi f[i] là giá trị dãy con (tùy điều kiện bài toán) từ phần tử thứ 1 đến
phần tử thứ i
- Lập công thức tính giá trị dãy con từ i đến j theo f[i] và f[j].
- Xét tất cả các cặp số (i,j) bằng hai vòng lặp sau:
for i:= 1 to n-1 do
for j:= i to n do
begin
{Xét các dãy con từ phần tử i đến j thỏa mãn điều kiện thì tăng số
14


dãy, lưu chỉ số đầu, chỉ số cuối}
end;
2.3.2.1.2.2. Bài toán ví dụ
Cho một dãy A gồm N số nguyên {a1, a2,…, aN}. Dãy con ai, ai+1,…, aj
(1≤i≤j≤N) là dãy được tạo từ các phần tử liên tiếp của dãy A bắt đầu từ phần tử i
và kết thúc ở phần tử j.
Yêu cầu: Hãy tìm dãy con liên tiếp có tổng lớn nhất.
Dữ liệu vào: File văn bản tonglt.inp gồm:
- Dòng đầu ghi giá trị N (1≤N≤10000).
- Dòng sau gồm N số nguyên{a1, a2,…, aN} (-106≤ai≤106) mỗi số cách
nhau một dấu cách.
Dữ liệu ra: File văn bản tonglt.out gồm
- Dòng đầu ghi tổng các phần tử dãy con và số lượng dãy con.
- Dòng tiếp theo ghi giá trị các phần tử dãy con.
Ví dụ:
Tonglt.inp
Tonglt.out

13
52 2
12 -34 14 11 9 -8 15 11 -7 -56 17 16 19
14 11 9 -8 15 11
17 16 19
Cách 1: Khi gặp bài toán này thông thường học sinh sẽ sử dụng phương pháp
vét cạn các dãy con như sau:
 Mô hình thuật toán:
Giống mô hình thuật toán cách 1 của bài toán ví dụ ở dạng 1.
 Cài đặt chương trình:
Type km=array[0..10001] of longint;
Const fi='tonglt.inp';fo='tonglt.out';
Var a,dau,cuoi:km;i,j,n:integer; k:longint;t,tmax:int64;
Function tong(b:km;m,l:integer):int64;
Var i:integer;
Begin tong:=0;
for i:=m to m+l-1 do tong:=tong+b[i];
End;
BEGIN
assign(input,fi);reset(input);assign(output,fo);rewrite(output);
readln(n); for i:=1 to n do read(a[i]);
tmax:=a[1]; k:=0;
for i:=1 to n-1 do
for j:=1 to n-i+1 do
begin t:=tong(a,i,j);
if t>tmax then begin tmax:=t;k:=0; end;
if t=tmax then begin k:=k+1;dau[k]:=i;cuoi[k]:=i+j-1; end;
end;
{in ket qua}
15



writeln(tmax, ' ',k);
for i:=1 to k do
begin for j:=dau[i] to cuoi[i] do write(a[j],' '); writeln; end;
close(input); close(output);
END.
Sử dụng phần mềm Themis. Ta đo được thời gian thực hiện mỗi test cụ
thể như sau: (có file test và code kèm theo)
Cách 1

Độ phức Test01
tạp
(giây)
0.065
0(n2)
6

Test02
(giây)
0.276
2

Test03
(giây)
3.286
3

Test04
(giây)


Test05
(giây)

Test06
(giây)

Test07
(giây)

Test08
(giây)

Test09
(giây)

Test10
(giây)

73.555

>100

>100

>100

>100

>100


>100

Với cách này học sinh chỉ lấy 20% số điểm. Vì một số test có dữ liệu lớn
chạy quá thời gian.
Cách 2: Sử dụng phương pháp quy hoạch động.
 Mô hình thuật toán:
- Gọi f[i] là tổng tất cả các phần tử từ 1 đến i.
- Như vậy dãy con liên tiếp từ i đến j có tổng là: f[j]-f[i-1].
- Xét tất cả các dãy con từ i đến j bằng 2 vòng lặp:
for i:= 1 to n-1 do
for j:= i to n do
begin
{Xét f[j]-f[i-1] thỏa mãn điều kiện thì tăng số dãy, lưu chỉ số đầu,
chỉ số cuối}
end;
 Cài đặt chương trình:
Const fi='tonglt.inp';fo='tonglt.inp';
Var a,f,dau,cuoi:array[0..100001] of longint;
i,j,n,dem:longint;tmax,k:int64;
Begin
assign(input,fi);reset(input);assign(output,fo);rewrite(output);
readln(n);for i:=1 to n do read(a[i]);
f[0]:=0;
for i:= 1 to n do f[i]:= f[i-1]+a[i];
tmax:= a[1];k:=0;
for i:= 1 to n-1 do
for j:= i to n do
begin
if f[j]- f[i-1] > tmax then begin tmax:= f[j] - f[i-1];k:=0;end;

if f[j]-f[i-1] =tmax then begin inc(k);dau[k]:=i;cuoi[k]:=j; end;
end;
writeln(tmax,' ',k);
for i:= 1 to k do
begin
for j:= dau[i] to cuoi[i] do write(a[j], ' '); writeln;
16


end;
close(input);close(output);
END.
Sử dụng phần mềm Themis. Ta đo được thời gian thực hiện mỗi test cụ
thể như sau: (có file test và code kèm theo)
Cách
2

Độ phức Test01
tạp
(giây)
0.045
0(n)
9

Test02
(giây)
0.077
1

Test03

(giây)
0.108
3

Test04
(giây)
0.102
4

Test05
(giây)

Test06
(giây)

Test07
(giây)

0.1452

0.2849

0.3125

Test08
(giây)
0.396
7

Test09

(giây)
0.495
5

Test10
(giây)
0.5471

Với cách này học sinh chỉ lấy 20% số điểm. Cách này không nên sử dụng.
So sánh kết quả từ 2 bảng trên và kết quả chấm điểm bài toán Ví dụ (của
dạng 2) bằng phần mềm Themis của 2 cách trên như sau (mỗi test đúng và thời
gian chạy không quá 1 giây/ 1 test được 1 điểm):

Dễ dàng nhận thấy cách 2 là tối ưu hơn mà chương trình ngắn gọn dễ cài
đặt phù hợp với năng lực học sinh trường tôi. Do vậy giải các bài tập dạng này
ta nên lựa chọn cách 2.
2.3.2.1.2.3. Bài toán áp dụng
Bài 1: Cho một dãy A gồm N số nguyên {a1, a2,…, aN} và một số nguyên K. Dãy
con ai, ai+1,…, aj (1≤i≤j≤N) là dãy được tạo từ các phần tử liên tiếp của dãy A bắt
đầu từ phần tử i và kết thúc ở phần tử j.
Yêu cầu: Hãy tìm dãy con liên tiếp có tổng các phần tử chia hết cho K.
Dữ liệu vào: File văn bản dayconchiam.inp gồm:
- Dòng đầu ghi hai số nguyên N và M (1≤N≤10000 ; 1≤M≤1000 ).
- Dòng sau gồm N số nguyên{a1, a2,…, aN} (106≤ai≤106, ai<>0) mỗi số
cách nhau một dấu cách.
Dữ liệu ra: File văn bản dayconchiam.out gồm
- Dòng đầu ghi số lượng dãy con thỏa mãn.
- Dòng tiếp theo ghi giá trị các phần tử dãy con thỏa mãn.
Ví dụ:
dayconchiam.inp

dayconchiam.out
43
2
1325
132
3
 Thuật toán:
Tương tự cách 2 bài toán ví dụ (của dạng 2) chỉ thay điều kiện bằng f[j]17


f[i-1] mod k =0.
 Code tham khảo:
{Sử dụng phương pháp quy hoạch động}
Const fi='dayconchiak.inp';fo='dayconchiak.out';
Var a,f,dau,cuoi:array[0..100001] of longint;
i,j,n,dem:longint;tmax,m,k:int64;
Begin
assign(input,fi);reset(input);assign(output,fo);rewrite(output);
f[0]:=0;k:=0;
readln(n,m);for i:=1 to n do begin read(a[i]); f[i]:=f[i-1]+a[i]; end;
for i:= 1 to n-1 do
for j:= i to n do
if (f[j]- f[i-1]) mod m =0 then
begin inc(k);dau[k]:=i;cuoi[k]:=j; end;
{in ket qua}
writeln(k);
for i:= 1 to k do
begin
for j:= dau[i] to cuoi[i] do write(a[j], ' '); writeln;
end;

close(input);close(output);
END.
2.3.2.2. Bài toán về dãy con có thể chọn không liên tiếp các phần tử
2.3.2.2.1. Bài toán cơ bản
Cho một dãy A gồm N số nguyên {a1, a2,…, aN}. Dãy con ai, ai+1,…, aj
(1≤i≤j≤N) là dãy thu được khi ta xóa một số phần tử (có thể không xóa phần tử
nào và không được xóa hết) của một dãy cho trước (dãy mẹ) và giữ nguyên thứ
tự các phần tử còn lại trong dãy. Hãy tìm các dãy con thỏa mãn một điều kiện
nào đó.
Đối với dạng bài tập này tôi định hướng cho học sinh lựa chọn thuật toán
quy hoạch động là tối ưu hơn cả.
 Thuật toán chung
- Gán giá trị cho bài toán cơ sở.
- Tính giá trị cho bài toán thứ i nhờ các bài toán đã tính trước đó.
- Kết quả bài toán là sự tổng hợp từ các bài toán ban đầu.
2.3.2.2.2. Bài toán ví dụ
Cho một dãy A gồm N số nguyên {a 1, a2,…, aN}. Dãy con ai≤ai+1≤…≤ aj
(1≤i≤j≤N) được gọi là dãy con không giảm của dãy A. Lưu ý các phần tử
của dãy con có thể chọn liên tiếp hoặc không liên tiếp từ các phần tử dãy
A nhưng phải theo đúng thứ tự. Độ dài của dãy con là số lượng phần tử
của dãy con đó.
Yêu cầu: Tìm độ dài lớn nhất của dãy con không giảm.
Dữ liệu vào: File văn bản dayconkogiam.inp gồm 2 dòng:
18


- Dòng đầu chứa một số nguyên dương N (1≤ N ≤ 104).
- Dòng thứ hai chứa N số nguyên dương ai ((-105≤ai ≤ 105), giữa hai
số cách nhau bởi một dấu cách.
Dữ liệu ra: File văn bản dayconkogiam.out gồm một số nguyên dương là

kết quả bài toán.
Ví dụ:
Dayconkogiam.inp
Dayconkogiam.out
8
4
51645217
 Thuật toán:
- Gọi f[i] là độ dài dãy con không giảm có phần tử cuối là a[i].
- Dễ dàng nhận thấy: f[1]=1;
- Ta có công thức quy hoạch động:
f[i]=max(f[j])+1 nếu a[j]<=a[i] (j=1..i-1)
f[i]= 1 nếu a[j]>a[i] (j=1..i-1)
- Kết quả bài toán là max(f[i]) (i=1..n).
 Cài đặt chương trình:
Const fi='dayconkogiam.inp'; fo='dayconkogiam.out';
Var a,b:array[1..10000] of longint; n,i,max:longint;
Procedure xuli;
var i,j,bmax:longint;
begin b[1]:=1; for i:=2 to n do
begin bmax:=0;
for j:=i-1 downto 1 do
if (a[j]<=a[i])and (b[j]>bmax) then bmax:=b[j];
b[i]:=bmax+1;
end;
end;
Procedure timmax;
var i:longint;
Begin max:=b[1];
for i:=2 to n do

if b[i]>max then max:=b[i];
write(max);
End;
BEGIN assign(input,fi);reset(input); assign(output,fo);rewrite(output);
readln(n); for i:=1 to n do read(a[i]);
xuli; timmax;
close(input); close(output);
END.
Sử dụng phần mềm Themis. Ta đo được thời gian thực hiện mỗi test:
Cách Độ phức Test01
1
tạp
(giây)

Test02
(giây)

Test03
(giây)

Test04
(giây)

Test05
(giây)

Test06
(giây)

Test07

(giây)

Test08
(giây)

Test09
(giây)

Test10
(giây)

19


0(n)

0.067

0.055

0.056

0.056

0.061

0.192

0.26


0.288

0.301

0.377

Từ bảng trên và kết quả chấm điểm bài toán ví dụ bằng phần mềm Themis:

Ta dễ dàng nhận thấy cách làm này rất tối ưu, thời gian thực hiện chương
trình ngắn. Đây là cách làm lấy được 100% điểm câu này.
Lưu ý: Các bài tập dãy con về dạng này rất khó nên học sinh phải linh hoạt trong
cách giải và nên sử dụng phương pháp quy hoạch động thì chương trình sẽ tối
ưu hơn.
2.4. Hiệu quả của sáng kiến kinh nghiệm
Với cách làm như vậy đã rèn luyện kỹ năng lập trình cho các học sinh tham
gia học đội tuyển, các em cũng có thói quen tối ưu hóa thuật toán và cài đặt
chương trình phù hợp, để ý đến về thời gian chạy chương trình hơn (không chỉ
quan tâm đến đáp số như trước đây).
Qua các lần thi khảo sát chất lượng học sinh giỏi về chuyên đề dãy con năm
học 2014 - 2015 chất lượng học sinh dần dần tiến bộ (nhận thấy thông qua điểm
lần sau thường cao hơn lần trước, mặc dù mức độ đề khó tăng dần).
Họ tên
Điểm lần 1
Điểm lần 2
Điểm lần 3
Điểm lần 4
Trần Ngọc Nhật
5/10
8/10
10/10

9/10
Lê Đình Miền
6/10
7/10
8/10
8/10
Bảng điểm các lần thi khảo sát chất lượng học sinh giỏi về chuyên đề dãy
con năm học 2015 – 2016:
Họ tên
Điểm lần 1
Điểm lần 2
Điểm lần 3 Điểm lần 4
Đỗ Hồng Quang
6/10
8/10
8/10
9/10
Lê Xuân Trường
7/10
7/10
10/10
9/10
Năm 2014 - 2015 chính thức tôi đứng đội tuyển, làm công tác bồi dưỡng
học sinh giỏi tỉnh môn tin học cho nhà trường. Năm học 2015 – 2016 tôi tiếp tục
dạy hỗ trợ đồng nghiệp trong công tác bồi dưỡng học sinh giỏi Tin. Cả hai năm
tôi đều áp dụng phương pháp trên khi giảng dạy tuy rất dày công nhưng hiệu quả
mang lại rất khả quan.
Kết quả điểm thi học sinh giỏi cấp tỉnh năm 2014 - 2015 môn Tin học
THPT của học sinh trường tôi có sự tiến bộ rõ rệt: 2 em tham gia thi đạt giải cả 2
em với 1 giải ba, 1 giải khuyến khích (trong khi năm 2013 - 2014 và những năm

học trước không có học sinh nào có giải) đặc biệt gần như học sinh không bị
mất điểm trong các bài ở mức độ cơ bản trong đề (câu 1, 2). Năm 2015 – 2016:
2 em tham gia thi cũng cả 2 em với 1 giải ba, 1 giải khuyến khích.
Như vậy rõ ràng việc giúp học sinh lựa chọn và cài đặt thuật toán tối ưu,
20


hiệu quả đem lại là rất rõ rệt, tránh được việc học sinh mất điểm vì những lí do
đáng tiếc trong kì thi học sinh giỏi THPT môn Tin học.

21


3. KẾT LUẬN VÀ KIẾN NGHI
3.1. Kết luận
Bài tập về dãy con rất nhiều và đa dạng, nhưng trong sáng kiến kinh
nghiệm trên tôi đã chia các bài tập dãy con thành các dạng cụ thể (chỉ là một số
dạng thường gặp). Đối với mỗi dạng tôi đưa ra cách giải tối ưu, các cách giải tối
ưu được trình bày chủ yếu bằng phương pháp quy hoạch động, đây là phương
pháp giải còn khá mới mẻ với học sinh trường tôi nhưng với sự kiên trì và ham
học hỏi của cả giáo viên, học sinh nên hiệu quả mang lại rất khả quan. Để chứng
minh cho sự tối ưu của cách giải đó tôi đưa ra bài toán ví dụ với nhiều cách giải
khác nhau (cả cách học sinh tự suy nghĩ và cách tôi đinh hướng), tính độ phức
tạp, đo thời gian thực hiện bằng phần mềm Themis. Vì vậy học sinh sẽ hiểu sâu
sắc hơn và giải quyết tốt hơn một số dạng bài tập về dãy con có dạng tương tự.
Từ đó áp dụng làm các bài tập khác nhạy bén hơn nhằm nâng cao chất lượng
học sinh giỏi và mang lại kết quả cao hơn trong các kì thi học sinh giỏi Tin.
Đề tài này có thể mở rộng thêm với nhiều dạng bài tập khác.
Kinh nghiệm trên sẽ là vốn tích lũy của bản thân tôi trong những năm ôn
luyện đội tuyển tiếp theo. Đồng thời, có thể là tài liệu tham khảo cho những

giáo viên trẻ còn thiếu kinh nghiệm trong bồi dưỡng học sinh giỏi.
Do thời gian có hạn và kinh nghiệm chưa nhiều nên đề tài không tránh khỏi
những thiếu sót, kính mong sự đóng góp ý kiến của các đồng nghiệp để đề tài
được hoàn thiện hơn.
3.2. Kiến nghị
Đối với tổ chuyên môn, cần phân dạng bài tập cho học sinh khi giảng dạy.
Ra nhiều dạng đề đúng với cấu trúc đề do Sở giáo dục Thanh Hóa quy định để
đưa vào ngân hàng đề làm phong phú nguồn tài liệu bồi dưỡng học sinh giỏi của
nhà trường.
Mong Ban giám hiệu nhà trường luôn duy trì việc tổ chức các kì thi khảo
sát chất lượng học sinh giỏi môn Tin để học sinh có cơ hội thử sức với các kì thi.
Tôi cũng mong muốn Sở Giáo Dục và Đào tạo Thanh Hóa nên tổ chức một
cuộc thi về lĩnh vực Tin học cho cả giáo viên và học sinh. Đây sẽ là sân chơi thú
vị cho giáo viên và học sinh, tạo động lực, hứng thú và ham thích tìm hiểu Tin
học. Đồng thời thông qua cuộc thi chúng ta có thể sẽ phát hiện thêm nhiều tài
năng về lĩnh vực Tin học góp phần tạo thêm nguồn nhân lực, nhân tài mới về
lĩnh vực công nghệ thông tin cho xã hội.
Trên đây chỉ là những kiến nghị mang tính chủ quan của tôi, nhưng cũng rất
mong được các cấp có thẩm quyền xem xét và sự góp ý của các đồng nghiệp.
XÁC NHẬN CỦA THỦ TRƯỞNG ĐƠN VI

Thanh Hóa, ngày 20 tháng 5 năm 2016
Tôi xin cam đoan đây là SKKN của
mình viết, không sao chép nội dung của
người khác.

Hoàng Thị Mai
22



MỤC LỤC
1. MỞ ĐẦU...........................................................................................................1
1.1.Lý do chọn đề tài.............................................................................................1
1.2.Mục đích nghiên cứu.......................................................................................1
1.3.Đối tượng nghiên cứu......................................................................................2
1.4.Phương pháp nghiên cứu.................................................................................2
2. NỘI DUNG NGHIÊN CỨU............................................................................3
2.1.Cơ sở lí luận.....................................................................................................3
2.2. Thực trạng.......................................................................................................3
2.2.1. Giới thiệu khái quát về trường.....................................................................3
2.2.2. Thực trạng trước khi nghiên cứu..................................................................4
2.3. Các biện pháp đã sử dụng để giải quyết vấn đề..............................................5
2.3.1. Cơ sở lý thuyết.............................................................................................5
2.3.1.1. Dãy con liên tiếp.......................................................................................5
2.3.1.2. Dãy con có thể chọn không liên tiếp.........................................................5
2.3.1.3. Độ phức tạp của thuật toán.......................................................................5
2.3.2. Biện pháp lựa chọn và cài đặt chương trình tối ưu khi giải một số dạng....6
2.3.2.1. Bài tập về dãy con liên tiếp.......................................................................6
2.3.2.1.1. Dạng 1: Các dãy con không chung nhau phần tử nào của dãy mẹ........6
2.3.2.1.1.1. Bài toán cơ bản...................................................................................6
2.3.2.1.1.2. Bài toán ví dụ......................................................................................7
2.3.2.1.1.3. Bài toán áp dụng...............................................................................11
2.3.2.1.2. Dạng 2: Các dãy con có thể chung nhau phần tử của dãy mẹ.............13
2.3.2.1.2.1. Bài toán cơ bản.................................................................................13
2.3.2.1.2.2. Bài toán ví dụ....................................................................................14
2.3.2.1.2.3. Bài toán áp dụng...............................................................................16
2.3.2.2. Bài toán về dãy con có thể chọn không liên tiếp các phần tử.................17
2.3.2.2.1. Bài toán cơ bản....................................................................................17
2.3.2.2.2. Bài toán ví dụ.......................................................................................17
2.4. Hiệu quả sáng kiến kinh nghiệm...................................................................18

3. KẾT LUẬN VÀ KIẾN NGHI.......................................................................19
3.1. Kết luận.........................................................................................................19
3.1. Kiến nghị.......................................................................................................19

23


TÀI LIỆU THAM KHẢO
[1] Sách giáo khoa Tin học 11, NXB Giáo dục.
[2] Giáo trình Giải thuật, Th.s. Nguyễn Văn Linh, Đại học Cần Thơ (2003).
[3] Giáo trình Cấu trúc dữ liệu và giải thuật, Trần Hạnh Nhi, Dương Anh Đức,
NXB Đại học quốc gia TPHCM.

24



×