Tài liệu đưa ra một số thuật toán cơ bản được viết code minh họa bằng python 3, có thể sử dụng làm tài liệu tham khảo cho học sinh hoặc bồi dưỡng học sinh giỏi ở giai đoạn cơ bản.Tài liệu có thể dùng cho các lớp học theo định hướng CS ở chương trình phổ thông mới
CHUYÊN ĐỀ 9: QUY HOẠCH ĐỘNG 9.1 MỘT SỐ BÀI TOÁN BẮT ĐẦU BÀI TOÁN FIBONACI Dãy Fibonaci định nghĩa sau: F1 F2 Fn Fn 1 Fn (n 3) Em tìm số Fibonaci thứ n * Ý tưởng – Thuật toán 1: Đệ quy Nhìn vào cơng thức ta thấy chất đệ quy, việc tính Fn ta viết dễ dàng ngắn gọn: Ta nhận xét cách làm thơng qua ví dụ sau: Khi ta gọi: x:=Fb(10) việc tính fb(10) tính sau: X:= fb(9) + fb(8) X:= fb(7) + fb(8) + fb(6) + fb(7) X:= fb(5) + fb(6) + fb(6) + fb(7) + fb(4) + fb(5) + fb(5) + fb(6) … Ta thấy bước thứ 3: có nhiều lời gọi hàm trùng lặp nhau: f6 gọi lần, f5 gọi lần … điều làm cho thời gian thực thi thuật toán lớn Chính thuật tốn đệ quy chạy với liệu nhỏ Với n>=44 thuật toán không khả thi * Ý tưởng cải tiến – Thuật toán 2: Quy hoạch động Để thuật toán ta chạy nhanh ta thấy cần cải tiến để fb(x) cần tính lần Để làm điều ta gọi F[i] số fibonaci thứ i (f mảng chiều) Khi ta thấy việc tính mảng nhanh chóng: Trong thuật tốn trên: Việc tính số fibonaci lưu lại, số tính lần, tính từ nhỏ đến lớn, Số fibo sau tính thơng qua số fibo nhỏ phần tư tưởng quy hoạch động (chú thích: có thuật tốn khác tốt để tính số fibonaci thứ n, nhiên để làm quen với tư tưởng QHĐ ta tạm dừng thuật tốn này) BÀI TỐN SẮP BỊ NGUỒN: NTU – TÊN BÀI: SABO Anh nông dân Bo có đàn bị gồm nhiều đực Trong hội chợ, anh muốn hàng bò gồm n Tuy nhiên bò đực hăng đứng gần nhau, anh phải tối thiểu k bò xen hai bò đực để chúng khỏi húc Bạn giúp anh Bo đếm thử xem có cách để hàng gồm n bò mà hai bị đực khơng húc (anh Bo có nhiều bị nên khơng sợ thiếu bị bị đực) Ví dụ với n = k= 1, ta có cách xếp sau (M: bò đực, F: bò cái): FFFF, MFFF, FMFF, FFMF, FFFM, MFMF, MFFM, FMFM Input - Gồm hai số nguyên n k cách khoảng trắng ( ≤ n, k ≤ 1.000) Output - Số cách xếp hàng thỏa mãn yêu cầu Do số lượng lớn nên cần in tối đa chữ số cuối (modulo 1.000.000) Ví dụ Sapbo.inp Sapbo.out Sapbo.inp Sapbo.out 41 52 * ý tưởng đầu tiên: đệ quy quay lui Ta nhận thấy quy về: Có dãy nhị phân có độ dài n cho kí tự cách k kí tự Ta duyệt quay lui tất cách bò (sinh tất dãy nhị phân có độ dài n thỏa mãn điều kiện) ta đếm Nhận xét: n0: s1= str(i)+' '+ str(j) #print(s1) s.append(s1) if L[i][j] == L[i-1][j] + C[i-1][j-1]: i -= else: j -= for i in s[::-1]: print(i,file = fo) return #main print(QHD(),file=fo) Trace() fo.close() fi.close() BÀI 9.2 CON THẠCH SÙNG Sau trận mưa tối hôm qua, tường nhà có nhiều muỗi đậu Bức tường có kích thước h x w vng, h số hàng đánh số từ đến h theo chiều từ xuống w số cột đánh số từ đến w theo chiều từ trái qua phải Tại ô vng có khoảng từ đến 1000 muỗi đậu Một thạch sùng muốn ăn nhiều muỗi có thể, tùy thuộc vào hạn chế sau: Nó bắt đầu chọn nhiều muỗi hàng ăn số muỗi Sau chuyển xuống vng hàng bên dưới, tiếp tục ăn muỗi đó, thạch sùng chuyển đến hết hàng ngang cuối để ăn số muỗi ô Khi chuyển xuống ô hàng dưới, chuyển theo hướng hình vẽ Yêu cầu: Cho h w số muỗi ô, thạch sùng ăn nhiều muỗi lần di chuyển từ hàng xuống hàng cuối cùng? Dữ liệu vào: Dòng đầu ghi hai số nguyên, số h – số hàng, số nguyên thứ hai w – số cột Dòng thứ i h dòng ghi w số nguyên m số muỗi ô Tất số nguyên cách dấu cách Dữ liệu ra: Một dòng ghi số nguyên số muỗi lớn mà thạch sùng ăn lần di chuyển từ hàng xuống hàng Ví dụ: Input Output 65 32 31742 21311 12218 22153 21444 57251 Hạn chế: ≤ h ≤ 500 ≤ w ≤ 500 ≤ m ≤ 1000 Giải thích ví dụ: Con thạch sùng chọn sau: hàng chọn 7, hàng chọn 1, hàng chọn 8, hàng chọn 5, hàng chọn 4, hàng chọn Tổng: + + + + + = 32 BÀI 9.2 ROBOT Cho hình chữa nhật NxM vng (N dịng, M cột) Mỗi vng ghi số ngun có giá trị khơng vượt q 100 thể cho mức độ cản trở Robot vào ô Một Robot đứng ô góc trái (1,1) muốn di chuyển xuống góc phải (N, M) hình chữ nhật Mỗi bước Robot di chuyển sang bên phải phía đứng u cầu: Tìm đường cản trở Robot tính tổng mức cản trở Robot đường (kể mức cản trở Robot đứng) Dữ liệu vào: Tệp ROBOT.INP - Dòng đầu chứa hai số nguyên N, M 1 N 100,1 M 100 - N dòng sau, dịng có M số ngun thể mức cản trở Robot NxM ô vuông Dữ liệu ra: Tệp ROBOT.OUT ghi số nguyên thể tổng mức cản trở Robot Ví dụ ROBOT.INP ROBOT.OUT 34 1111 2 100 9421 BÀI 9.2 BÀI TỐN BÀN CỜ Xét bàn cờ hình vng kích thước nxn với c[i,j] số lượng hạt đậu nằm ô [i,j] Một quân cờ xuất phát từ ô hàng 1, ta cần tìm đường đến hàng cuối n cho số lượng hạt đậu quân cờ nhặt đường lớn Quân cờ thẳng xuống, chéo xuống sang trái chéo xuống sang phải quân cờ qua ô nhặt số lượng hạt đậu (n