Skkn chuyên đề môn tin học cải tiến bài toán quy hoạch động bằng kỹ thuật chia để trị

22 4 0
Skkn chuyên đề môn tin học cải tiến bài toán quy hoạch động bằng kỹ thuật chia để trị

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

MỤC LỤC MỤC LỤC 1 1 Mở đầu 3 2 Cải tiến bài toán quy hoạch động mở rộng với kỹ thuật chia để trị 4 Xét ví dụ sau bài toán dãy số 5 Hướng dẫn thuật toán 6 Code mẫu 7 Link Test và code mẫu 8 3 Bài tập ứ[.]

MỤC LỤC MỤC LỤC 1 Mở đầu Cải tiến toán quy hoạch động mở rộng với kỹ thuật chia để trị Xét ví dụ sau: tốn dãy số Hướng dẫn thuật toán: Code mẫu: Link Test code mẫu: Bài tập ứng dụng Bài 1: Famous Pagoda (F - ACM ICPC Vietnam Regional 2017) Mức độ Hướng dẫn thuật toán: Code mẫu: 11 Link Test code mẫu: 13 Bài 2: SEQPART – Mức độ 13 Hướng dẫn thuật toán: 14 Code mẫu: 15 Link Test code mẫu: 16 Bài Bài toán Dãy Fibonacci – FIBSEQ Mức độ 16 Hướng dẫn thuật toán: 17 Code mẫu: 19 Link Test code mẫu: 22 Bài 4: Mining – mức độ khó .22 Hướng dẫn thuật toán: 23 Code mẫu: 25 Link Test code mẫu: 26 Bài 5: F Yet Another Minimization Problem – Mức độ khó .26 Hướng dẫn thuật toán: 27 Code mẫu: 28 Link Test code mẫu: 29 Bài tập tham khảo 29 Kết luận 29 skkn Tài liệu tham khảo 30 skkn CẢI TIẾN BÀI TOÁN QUY HOẠCH ĐỘNG BẰNG KỸ THUẬT CHIA ĐỂ TRỊ Mở đầu Trong năm gần nội dung thi học sinh giỏi Tin học cấp Quốc gia nội dung kiến thức ngày nâng cao đòi hỏi học sinh phải có tư sáng tạo lập trình Bài toán tổng hợp từ nhiều kiến thức khác Trong tốn địi hỏi tư thuật tốn tốt kĩ lập trình cao đạt điểm tối đa Kĩ thuật quy hoạch động kĩ thuật thường hay gặp kì thi học sinh giỏi Tin học Quốc gia Quốc tế Bài toán giải phương pháp quy hoạch động thường toán tối ưu Để cải tiến thuật tốn quy hoạch động thường có kĩ thuật chia để trị, sử dụng bao lồi đường thẳng Convex hux trick, kĩ thuật đổi biến số kết hợp cấu trúc liệu nâng cao stack, set, multiset, deque để tăng tốc toán tối ưu Để giảm độ phức tạp thuật toán từ O(n 3) O(n2logn), hay từ O(n2) O(nlogn) từ O(n) O(logn) tùy thuộc vào độ lớn liệu tốn kĩ thuật lập trình kết hợp công thức quy hoạch động để giải toán tối ưu cách hiệu Chia để trị phương pháp hiệu để thiết kế thuật toán Nguyên lý thực thuật toán chia để trị thực qua hai bước sau:  Bước (chia): Chia toán lớn thành toán nhỏ  Bước (trị): Gọi đệ quy giải tốn con, sau gộp lời giải toán thành lời giải toán lớn Trong chuyên đề giới thiệu kĩ thuật cải tiến tăng tốc toán quy hoạch động phương pháp chia để trị nhằm giảm độ phức tạp thuật tốn nâng cao hiệu lập trình skkn Cải tiến toán quy hoạch động mở rộng với kỹ thuật chia để trị Tiếp cận toán quy hoạch động mở rộng kỹ thuật chia để trị cách tiếp cận với hai kỹ thuật dùng đệ quy có nhớ (memorization) kết hợp lập bảng quy hoạch động dựa công thức truy hồi Khi vừa lưu trữ thực giải pháp toán giúp nâng cao hiệu suất thực toán (xử lý tối ưu) Ví dụ xét tốn Fibonaci: - Sử dụng đệ quy với độ phức tạp O(2n) cách tiếp cận top – down Fib(n) { if (n < 2) result = n else result = Fib(n-2) + Fib(n-1) F[n] = result return F[n] } - Tiếp cận bottom up phương pháp lập bảng quy hoạch động để giảm thời gian thực thuật toán với độ phức tạp O(n) sau: Fib(n) { F[0] = F[1] = for i = n F[i] = F[i-2] + F[i-1] return F[n] } Ý tưởng toán quy hoạch động mở rộng kỹ thuật chia để trị phải xác định toán lập bảng phương án quy hoạch động dựa công thức truy hồi chia để trị đâu việc lưu trữ giá trị sử dụng chúng để tính cho thời điểm chương trình thực tối ưu Xét ví dụ sau: tốn dãy số Trong tiết học dãy số trường, thầy giáo Tý cho lớp chơi trò chơi sau: Cho dãy số A bao gồm N số nguyên, yêu cầu chia dãy số thành hai phần liên tiếp cho tổng số phần bên trái tổng số phần bên phải Với bước bạn điểm cịn khơng thể chia trị chơi kết thúc Sau chia thành công bạn chọn dãy số bên trái bên phải để tiếp tục chơi với bước trò chơi kết thúc Là học sinh giỏi lớp, Tý muốn đạt số điểm cao Bạn tính xem số điểm lớn mà Tý đạt bao nhiêu? Dữ liệu vào từ tệp văn SEQ.INP:  Dòng ghi số nguyên T (1≤ T ≤ 10) số lượng liệu Mỗi liệu bao gồm hai dòng:  Dòng ghi số nguyên N số lượng phần tử dãy A  Dòng thứ hai gồm N phần tử dãy A ghi cách dấu cách (0 ≤ ≤ 10 ) Kết ghi tệp văn SEQ.OUT: Với liệu in số nguyên dòng kết liệu Ví dụ: SEQ.INP 3 SEQ.OUT skkn 3 2 2 1 1 Giới hạn:  30% số liệu có N≤ 200  60% số liệu có N≤ 2000  100% số liệu có N≤ 20000 Hướng dẫn thuật toán: Đây dạng toán quy hoạch động kết hợp với kĩ thuật chia để trị để giải tối ưu tốn cách dễ dàng: - Đầu tiên xử lý liệu vào kĩ thuật tổng cộng dồn O(n) - Để phân chia dãy a1, a2, …, an thành đoạn có tổng ta sử dụng thuật toán chặt nhị phân để tìm vị trí low vị trí chia dãy số thành hai dãy có tổng dãy - Khi đáp án tốn ans=1+max( tinh(1,low), tinh(low+1, n)) - Kết hợp kỹ thuật quy hoạch động chia để trị sau: + Đầu tiên ta tìm vị trí mà tổng hai dãy kĩ thuật chặt nhị phân long long half = (s[r] - s[l]) / 2; int low = l, high = r; while (low + < high) { int mid = (low + high) / 2; if (s[mid] - s[l] C[i]; sum[i] = sum[i - 1] + C[i]; } for (int i = 1; i = cost(a, c) + cost(b, d) Kết luận ta dùng QHĐ chia để trị để giải toán với độ phức tạp O(G*N*log(G)) Code mẫu: #include using namespace std; const int maxn = 2002; int n, g, k; int a[maxn]; long long cost[maxn][maxn]; inline long long calc(long long a, long long b, long long c) { if (b % (2 * a) == 0) { long long x = b / (2 * a); return a * x * x - b * x + c; } else { long long x = b / (2 * a); long long y = x + 1; return min(a * x * x - b * x + c, a * y * y - b * y + c); } } void prepare() { if (k == 1) { for (int i = 1; i 1]; } } } else { for (int i = 1; i

Ngày đăng: 13/02/2023, 08:44

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan