Thuật toán QHĐ kinh điển

Một phần của tài liệu (SKKN mới NHẤT) SKKN sử dụng phương pháp dạy học tích cực vào dạy thuật toán trong ngôn ngữ lập trình pascal nhằm nâng cao chất lượng bồi dưỡng học sinh giỏi tin học THPT (Trang 27 - 32)

(Buổi 9 - Thuật toán quy hoạch động điển hình - Chương trình bồi dưỡng HSG 12 năm học 2019-2020).

Bước 1. Tìm hiểu nội dung cần giải quyết:

Giáo viên cho học sinh xem nội dung đề bài của các bài toán. Sau đó để học sinh xác định input, output, ý tưởng của bài toán. Kết thúc bước này giáo viên đưa ra câu hỏi dẫn dắt bài toán.

Bài 1: Gọi L[i] là độ dài dãy con tăng dần, dài nhất của a[1],a[2],..,a[i] và kết thúc bởi a[i] thì ta tính được:

L[1]=?; L[2]=?; …; L[i]=?

Bước 2. Khái quát vấn đề chính trong bài học: Từ việc đọc đề bài, ghi nhớ và làm việc với tư liệu minh họa học sinh đưa ra nội dung chính của bài học. Giáo viên đưa ra câu hỏi “ trình bày ý tưởng giải quyết cho bài toán”, để trả lời câu hỏi này học sinh sẽ tìm hiểu, động não qua các ví dụ minh họa… học sinh có thể đối chiếu với những vấn đề qua các ví dụ minh hoạ khác, so sánh, kiểm tra tính đúng đắn của thuật toán.

Bài 1: VD: n=6

9 1 3 7 4 6

Giáo viên cụ thể đưa ra gợi ý.

n 9 1 3 7 4 6 i 1 2 3 4 5 6 L[1]=1; L[2]=1; L[3]=1 =L[2]+1=1+1=2  Truoc[3]=2; L[4]=1 =max(1+L[2],1+L[3]) =1+2=3  Truoc[4]=3 L[5]=1 =max(1+L[2],1+L[3]) =1+2=3  Truoc[5]=3 L[6]=1

=max(1+L[2],1+L[3],1+L[4]) =1+3=4  Truoc[6]=5

Bước 3. Tiến hành cho học nhóm. Giáo viên sau khi chia 2 nhóm thực hiện hoạt động bài học. Các nhóm bắt đầu phân công nhiệm vụ cụ thể cho mỗi thành viên. Trong hoạt động của nhóm thì nhóm 1 lại chia làm 2 đội, mỗi đội nhỏ đảm nhận 1 nội dung, khi làm thì các đội nhỏ dưới sự chỉ đạo của nhóm trưởng có thể trao đổi qua lại với các thành viên khác trong nhóm khác và tạo ra kết quả chung là sản phẩm được giao thực hiện. Từng cá nhân sẽ thu thập dữ liệu qua các nguồn, phân tích và tích lũy kiến thức thu được trong khi làm việc, các kiến thức mà học sinh tích lũy được thử nghiệm qua thực tiễn. Để xây dựng thuật toán thống nhất, tối ưu và hiệu quả nhất, hình thành năng lực viết chương trình cho các em.

Nhóm 1 :

- Xác định cấu trúc con tối ưu của bài toán.

- Xây dựng công thức truy hồi thể hiện mối quan hệ giữa các bài toán con.

Nhóm 2:

- Xác định trình tự tính toán như thế nào cho hợp lý? - Giải quyết trực tiếp các bài toán con cơ bản như thế nào?

- Dựa trên giá trị tối ưu của các bài toán con xác định được từ công thức QHĐ tính toán, truy vết tìm ra nghiệm của bài toán ban đầu.

Bước 4. Thu thập kết quả, báo cáo: Kết quả cuối cùng của nhóm thực hiện là chương trình được học sinh viết trên phần mềm Free Pascal. Giáo viên cho các nhóm báo cáo việc thực hiện chương trình và sản phẩm của nhóm.

Nhóm 1 và 2 trình bày báo cáo và chương trình trên máy chiếu, mà nhóm làm. Nhóm 1: Xây dựng công thức QHĐ

L[1]=1

L[i]  L[1]…L[i-1] với (1<=j<=i-1) thỏa mãn a[j]<=a[i]; L[i] = max(1+L[j]) = 1+ max( L[j])

Nhóm 2: Thực hiện truy vết Truoc[j]=j0

a1 a2 ..aj0…ai-1 ai  a[j0] = a[Truoc[j]] L[1]…L[k]…L[i] a[k]=a[Truoc[k]]

- Sau khi đại diện nhóm báo cáo, học sinh giữa các nhóm lớp trao đổi tranh luận tham chiếu và đặt câu hỏi với nhau để cùng làm sáng tỏ vấn đề, đưa ra lựa chọn thuật toán tốt nhất cho bài toán.

Nhóm 1: procedure QHD; var i, j: integer; begin fillchar(Truoc, sizeof(Truoc), 0); L[1]:= 1; for i:= 2 to n do begin L[i]:= 1; for j:= 1 to i-1 do if a[j] <= a[i] then

if 1 + L[j] > L[i] then begin L[i]:= L[j] + 1; Truoc[i]:= j; end; end; end; Nhóm 2:

procedure TruyVet(k: integer); begin if Truoc[k] = 0 then begin write(f, a[k]); exit; end;

TruyVet(Truoc[k]); write(f, ' ', a[k]); end;

Kết quả đạt được từ công việc của nhóm 1 và nhóm 2

Hình 5.1.Hình ảnh sản phẩm và kết quả bài 1 của học sinh (adsbygoogle = window.adsbygoogle || []).push({});

- Ban giám khảo là giáo viên dạy và đại diện của các nhóm, giáo viên dự giờ (giáo viên dạy mời các giáo viên trong nhóm Tin tại trường )

Bước 5. Đánh giá giờ học, rút kinh nghiệm:

- Giáo viên đánh giá bài báo cáo của nhóm học sinh, cả quá trình thực hiện qua sản phẩm như thuyết trình trên lớp, trình bày chương trình trên máy tính, tinh thần hợp tác khi làm việc nhóm và hỏi: “Bài báo cáo, chương trình và kết quả chương trình đạt yêu cầu về ý tưởng, chương trình và câu hỏi tham luận, tính chính xác, thuật toán đã tối ưu hiệu quả nhất chưa?”, “Các thành viên nhóm khác đánh giá chéo lẫn nhau. Mục đích giúp học sinh biết cách đánh giá rút kinh nghiệm cho nhau, rèn tư duy biện chứng vấn đề.

- Giáo viên rút kinh nghiệm thông qua 1 số câu hỏi: “Trong quá trình học em học được gì từ các bạn học sinh trong nhóm?”. Học sinh học được qua những câu hỏi cả của người học, dự báo cáo và giáo viên.

- Giáo viên mở rộng cho từng bài toán, yêu cầu các em vận dụng linh hoạt thuật toán đã được học từ đó có thể giải quyết các bài toán khác sáng tạo, và xử lý tốt các bài toán bắt gặp trong đề thi HSG mà cần có các thuật toán này hỗ trợ.

N=7

-1 7 -2 -3 4 2 -3

Nhóm 1:

- Xác định cấu trúc con tối ưu của bài toán

Bằng cách tiếp cận tự nhiên, chúng ta xác định được: mảng con liên tục có tổng lớn nhất cần tìm sẽ phải kết thúc tại một trong n vị trí: hoặc 1, hoặc 2,…, hoặc n. Vậy nếu ta gọi L(i) là độ dài mảng con liên tục có tổng lớn nhất lấy từ miền a1 đến ai và phần tử cuối cùng là ai thì độ dài của mảng con liên tục dài nhất là: max{L(i) với 1≤ i≤ n}. Ta đã đạt được việc xác định được cấu trúc con tối ưu cho bài toán, điều này được chứng tỏ bằng bước 2 ngay sau đây:

- Xây dựng công thức QHĐ

Do mảng con liên tục lớn nhất từ a1 tới ai hoặc là chứa ai-1 hoặc là không chứa ai-1. Trường hợp không chứa ai-1 thì mảng con liên tục ñó chỉ chứa một phần tử là ai mà thôi (vì yêu cầu mảng phải liên tục). Vậy: L(i) = max{a[i], L(i-1) + a[i]}

Nhóm 2:

- Xác định trình tự tính toán thế nào cho hợp lý?

Trường hợp đơn giản này chỉ cần tính toán theo trình tự tự nhiên. for i:= 2 to n do L[i]:= max(a[i], L[i-1] + a[i]);

- Xác định bài toán con cơ bản L[1]:= a[1];

Bước 5: Truy vết, tìm nghiệm max:= -∞;

for i:= 1 to n do if L[i] > max then begin max:= L[i]; k:= i; end; i:= k; while max > 0 do begin

writeln(i, a[i]); max:= max - a[i]; i:= i - 1;

end;

- Học sinh tiếp tục thực hiện công việc mới được giao với những gợi ý và dẫn dắt của giáo viên trong phần mở rộng.

Kết quả đạt được từ công việc của nhóm 1 và nhóm 2

Hình 5.2. Hình ảnh sản phẩm và kết quả bài 2 mở rộng của học sinh

- Giáo viên đánh giá năng lực học sinh, kĩ năng lập trình, hiểu bài, biết cách vận dụng sáng tạo giải quyết các bài toán khác.

Một phần của tài liệu (SKKN mới NHẤT) SKKN sử dụng phương pháp dạy học tích cực vào dạy thuật toán trong ngôn ngữ lập trình pascal nhằm nâng cao chất lượng bồi dưỡng học sinh giỏi tin học THPT (Trang 27 - 32)