Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 22 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
22
Dung lượng
427,97 KB
Nội dung
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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Tài liệu tham khảo 30 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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 tốn tổng hợp từ nhiều kiến thức khác Trong tốn địi hỏi tư thuật toá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 toá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 toá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 toán con, sau gộp lời giải tốn thành lời giải tốn lớn Trong chun đề tơi 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 toán nâng cao hiệu lập trình LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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 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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 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 tố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 toá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