1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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ị

21 94 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 21
Dung lượng 175,41 KB

Nội dung

MỤC LỤC 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 tố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 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 2 Cải tiến tố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 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 333 SEQ.OUT 3 2222 4101101 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 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 tố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 toá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: 18/08/2020, 22:11

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w