(Sáng kiến kinh nghiệm) chủ đề môn tin học cây và quy hoạch động trên cây

42 22 0
(Sáng kiến kinh nghiệm) chủ đề môn tin học cây và quy hoạch động trên cây

Đ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

GV: Nguyễn Như Thắng – THPT Chuyên Lào Cai HỘI THẢO KHOA HỌC CÁC TRƯỜNG THPT CHUYÊN KHU VỰC DUYÊN HẢI VÀ ĐỒNG BẰNG BẮC BỘ NĂM 2019 Môn: Tin học Chủ đề: CÂY VÀ QUY HOẠCH ĐỘNG TRÊN CÂY Tháng 8/2019 Trang GV: Nguyễn Như Thắng – THPT Chuyên Lào Cai MỤC LỤC Mở đầu Một số khái niệm, kiến thức 1.1 Phương pháp quy hoạch động 1.2 Đồ thị dạng 1.3 Duyệt đồ thị 1.4 Tổ tiên chung gần Một số tập áp dụng 2.1 Bài tập 1: Nhánh có tổng lớn 2.1.1 Đề 2.1.2 Phân tích tốn 2.1.3 Chương trình minh họa 2.1.4 Test: 2.2 Bài tập 2: Tổng lớn 2.2.1 Đề 2.2.2 Phân tích tốn 2.2.3 Chương trình minh họa 10 2.2.4 Test: 10 2.3 Bài 3: Dán tranh 11 2.3.1 Đề 11 2.3.2 Phân tích tốn 11 2.3.3 Chương trình minh họa 11 2.3.4 Test: 12 2.4 Bài 4: Khoảng cách K 12 2.4.1 Đề 12 2.4.2 Phân tích tốn 13 2.4.3 Chương trình minh họa 13 2.4.4 Test 14 2.5 Bài 5: Đường kính 14 2.5.1 Đề bài: 14 2.5.2 Phân tích tốn 14 2.5.3 Chương trình minh họa 14 2.5.4 Test 15 2.6 Bài 6: Tô màu cho 16 Trang GV: Nguyễn Như Thắng – THPT Chuyên Lào Cai 2.6.1 Đề 16 2.6.2 Phân tích toán 16 2.6.3 Chương trình minh họa 17 2.6.4 Test 18 2.7 Bài 7: Tổng lớn 18 2.7.1 Đề 18 2.7.2 Phân tích tốn 18 2.7.3 Chương trình minh họa 19 2.7.4 Test 20 2.8 Bài 8: Khỉ học nhảy 20 2.8.1 Đề 20 2.8.2 Phân tích tốn 20 2.8.3 Chương trình minh họa 21 2.8.4 Test 22 2.9 Bài 9: Trọng tâm 22 2.9.1 Đề 22 2.9.2 Phân tích tốn 23 2.9.3 Chương trình minh họa 24 2.9.4 Test 25 2.10 Bài 10: Bánh Quy 25 2.10.1 Đề 25 2.10.2 Phân tích tốn 26 2.10.3 Chương trình minh họa 26 2.10.4 Test 28 2.11 Bài 11: Hội nghị Mỹ - Triều lần 28 2.11.1 Đề 28 2.11.2 Phân tích tốn 29 2.11.3 Chương trình minh họa 30 2.11.4 Test 32 2.12 Bài 12: Tổng 32 2.12.1 Đề 32 2.12.2 Phân tích toán 32 2.12.3 Chương trình minh họa 33 2.12.4 Test 35 Trang GV: Nguyễn Như Thắng – THPT Chuyên Lào Cai 2.13 Bài 13: Khoảng cách 36 2.13.1 Đề 36 2.13.2 Phân tích tốn 36 2.13.3 Chương trình minh họa 36 2.13.4 Test 38 Một số tự luyện 38 3.1 Bài 1: Tổng 39 3.2 Bài 2: Thêm cạnh 39 3.3 Bài 3: LCA 40 3.4 Bài 4: LCA2 40 3.5 Bài 5: SUM3 41 3.6 Một số khác 41 Kết luận 42 Nguồn tài liệu tham khảo 42 Trang GV: Nguyễn Như Thắng – THPT Chuyên Lào Cai QUY HOẠCH ĐỘNG TRÊN CÂY Mở đầu Ta thấy duyệt đồ thị dạng xuất chất toán thiết kế thuật toán Quy hoạch động Do đó, đồ thị dạng cây, ta có lớp toán mà ta thường gọi Quy hoạch động (hay Dynamic programming on the tree) Chuyên đề này, xin phép chia sẻ số tốn q trình dạy đội tuyển HSG môn Tin học lớp 10 hè chuẩn bị lên lớp 11 Học sinh cần có số kiến thức để đảm bảo học chuyên đề là: Kiến thức phương pháp Quy hoạch động; Đồ thị, Duyệt đồ thị theo chiều sâu (DFS); kĩ thuật bảng thưa để giải toán LCA Khi học sinh nắm vững dạng tốn này, mở rộng thành dạng tốn đồ thị vơ hướng tổng qt, đó, thành phần song liên thơng coi đỉnh cây, thu gọn xét cạnh cầu tương ứng cạnh rừng, Sau dạy cho học sinh quen dạng này, dễ dang hướng dẫn học sinh tiếp cận kĩ thuật cao để giải toán liên quan đến Heavy light decomposition, Centroid decomposition, Thực áp dụng chuyên đề học sinh mình, kết thu khả quan, học sinh tiếp cận tốt số kĩ thuật khó Một số khái niệm, kiến thức 1.1 Phương pháp quy hoạch động Như biết, tốn giải phương pháp quy hoạch động cần đảm bảo đặc điểm bật sau: - Có tính chất tốn gối (overlapping subproblem): Có thể chia nhỏ tốn lớn thành tốn - Có cấu trúc tối ưu (optimal substructure): Kết hợp lời giải toán ta lời giải toán lớn 1.2 Đồ thị dạng Theo định lý Daisy Chain, gọi 𝑇 = (𝑉, 𝐸) đồ thị vơ hướng có 𝑛 đỉnh, mệnh đề sau tương đương: - 𝑇 - 𝑇 khơng chứa chu trình đơn có 𝑁 − cạnh - 𝑇 liên thông cạnh cầu - Giữa đỉnh 𝑇 tồn đường đơn - 𝑇 khơng chứa chu trình, thêm vào cạnh ta lại thu chu trình - 𝑇 liên thơng vào có 𝑁 − cạnh Từ ta gọi gốc 𝑢 𝑇[𝑢] Trang GV: Nguyễn Như Thắng – THPT Chuyên Lào Cai 1.3 Duyệt đồ thị Cách cài đặt đơn giản sử dụng kĩ thuật đệ quy để duyệt đồ thị theo chiều sâu, mơ hình cài đặt duyệt sau: void dfs(int u, int parent) { for(int v:adj[u]) if (v!=parent) { dfs(v,u); } } Cách cài đặt dùng để quy hoạch động ngược từ lên, để tổng hợp thông tin từ đỉnh lên đỉnh cha Thao tác đơn giản thể chất Quy hoạch động Thông qua duyệt DFS, ta tính tốn, tổng hợp thông tin cần thiết từ đỉnh đến đỉnh cha ngược lại Hay chia nhỏ toán, kết hợp toán nhỏ lại để tạo toán lớn Mỗi đỉnh duyệt không lần, cạnh duyệt không lần, đo độ phức tạp duyệt 𝑇[1] ln 𝑂(𝑁) Có số tập chuyên đề cần tổng hợp thông tin xuôi từ đỉnh cha xuống đỉnh hay gọi quy hoạch xuôi, phức tạp hơn, làm theo cách cập nhật ngược lên cha thơng tin loại bỏ thơng tin đi, sau cập nhật thơng tin từ cha xuống con, ta vào tình cụ thể để phân tích 1.4 Tổ tiên chung gần Tổ tiên chung gần (LCA) khái niệm lý thuyết đồ thị khoa học máy tính Cho T có gốc N đỉnh Tổ tiên chung gần đỉnh u v đỉnh thấp T mà nhận u, v làm hậu duệ (con, cháu) Có thể coi đỉnh – Wikipedia Một số tập áp dụng 2.1 Bài tập 1: Nhánh có tổng lớn 2.1.1 Đề Cho đồ thị dạng 𝑇[1], gồm 𝑁 đỉnh, đỉnh đánh số từ đến N, đỉnh 𝑖 gán số nguyên dương 𝑎𝑖 , hỏi đường có tổng số ghi đỉnh từ gốc xuống đỉnh bao nhiêu? Dữ liệu vào: Dòng số 𝑁 số đỉnh đồ thị Trang GV: Nguyễn Như Thắng – THPT Chuyên Lào Cai Dòng ghi 𝑁 số nguyên dương 𝑎1 , 𝑎2 , … 𝑎𝑁 số gán với 𝑁 đỉnh theo thứ tự Dòng có 𝑁 số 𝑝1 , 𝑝2 , 𝑝𝑁 thể có đường từ đỉnh 𝑖 đến 𝑝𝑖 với ≤ 𝑝𝑖 ≤ 𝑁; 𝑝1 = đỉnh gốc ban đầu Kết ra: Một số đường có tổng lớn Ràng buộc: 𝑁 ≤ 2.105 , 𝑎𝑖 ≤ 109 Ví dụ: Summax1.inp Summax1.out 14 22 10 5 1 2 4 5 7 2.1.2 Phân tích toán Thuật toán 1: Duyệt trâu, độ phức tạp 𝑂(𝑁 ) Duyệt DFS lần để tìm thứ tự cha đỉnh Với đỉnh gốc (khác đỉnh 1), ta duyệt ngược lên cha đến gặp đỉnh gốc Lấy max tất đường Thuật toán 2: Quy hoạch động, độ phức tạp 𝑂(𝑁) Gọi 𝑑𝑝[𝑢] tổng lớn thu từ đỉnh 𝑖 xuống đỉnh Khi đó, ta có: 𝑑𝑝[𝑢] = 𝑎[𝑢] với 𝑢 { 𝑑𝑝[𝑢] = max(𝑎[𝑢] + 𝑑𝑝[𝑣]) với 𝑣 𝑢 Dễ dàng tính giá trị 𝑑𝑝[ ] q trình duyệt DFS 𝑇[1] Hãy quan sát hình vẽ minh họa bên dưới: Trang GV: Nguyễn Như Thắng – THPT Chuyên Lào Cai Độ phức tạp thuật toán độ phức tạp duyệt DFS đồ thị Ở là: 𝑂(𝑛) Bạn hồn tồn cập nhật ngược lại theo cách trên, tức cập nhật tổng từ gốc đến đỉnh bên dưới, sau tìm max Độ phức tạp 2.1.3 Chương trình minh họa #include #define N 200005 #define task "summax1" #define int long long using namespace std; int n,a[N],dp[N]; vector adj[N]; void dfs(int u, int parent) { dp[u]=a[u]; //khoi tao thong tin for(int v:adj[u]) { if (v!=parent) { dfs(v,u); dp[u]=max(dp[v]+a[u],dp[u]); //cap nhat thong tin } } } signed main() { ios_base::sync_with_stdio(false); cin.tie(0), cout.tie(0); freopen(task".inp", "r", stdin); freopen(task".out","w",stdout); cin>>n; for(int i=1; i>a[i]; for(int i=1; i>u; if(u==0) continue; adj[u].push_back(i); adj[i].push_back(u); } dfs(1,0); coutn; for(int i=1; i>a[i]; for(int i=1; i>p; adj[p].push_back(i); adj[i].push_back(p); } root=adj[0][0]; dfs(root,0); coutt[i]; } for(int i=2; i>p; adj[p].push_back(i); } for(int i=2; i>L[i]; } dfs(1,T); coutu>>v; adj[u].push_back(v); adj[v].push_back(u); } dfs(1,0); cin>>m; while(m ) { int u, v, ans; cin>>u>>v; if(depth[u]

Ngày đăng: 15/06/2021, 14:16

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

Tài liệu liên quan