1. Trang chủ
  2. » Luận Văn - Báo Cáo

SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG để GIẢI MỘT SỐ BÀI TOÁN CÓ TÍNH TRUY HỒI TRONG NGÔN NGỮ LẬP TRÌNH c++

39 3 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

Tiêu đề Sử Dụng Phương Pháp Quy Hoạch Động Để Giải Một Số Bài Toán Có Tính Truy Hồi Trong Ngôn Ngữ Lập Trình C++
Tác giả Nguyễn Thị Thương, Hồ Văn Chiến
Trường học Trường THPT Phan Đăng Lưu
Chuyên ngành Tin học
Thể loại sáng kiến kinh nghiệm
Năm xuất bản 2021 - 2022
Thành phố Nghệ An
Định dạng
Số trang 39
Dung lượng 1,04 MB

Nội dung

SỞ GIÁO DỤC VÀ ĐÀO TẠO NGHỆ AN Đơn vị: Trƣờng THPT Phan Đăng Lƣu SÁNG KIẾN KINH NGHIỆM Đề tài: SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG ĐỂ GIẢI MỘT SỐ BÀI TỐN CĨ TÍNH TRUY HỒI TRONG NGƠN NGỮ LẬP TRÌNH C++ Mơn/Lĩnh vực: Tin học Ngƣời thực hiện: Nguyễn Thị Thƣơng Hồ Văn Chiến Tổ: Toán - Tin Điện thoại: 0976607114 - 0979783682 Có đính kèm: Mơ hình Phần mềm Phim ảnh Năm học: 2021 - 2022 Hiện vật khác MỤC LỤC Phần I ĐẶT VẤN ĐỀ 1 Lý chọn đề tài Mục tiêu, nhiệm vụ đề tài Đối tƣợng nghiên cứu Phƣơng pháp nghiên cứu Phần II NỘI DUNG NGHIÊN CỨU 1.Cơ sở lý luận 2 Thực trạng vấn đề nghiên cứu Nội dung vấn đề nghiên cứu 3.1 Tên chủ đề 3.2 Cơ sở lý thuyết 3.2.1 Khái niệm phƣơng pháp quy hoạch động 3.2.2 Các bƣớc giải toán quy hoạch động 3.2.3 Biện pháp lựa chọn cài đặt chƣơng trình 3.3 Các tập áp dụng 3.3.1 Dạng toán dãy liên tiếp 3.3.2 Dạng tốn dãy khơng liên tiếp 10 3.3.3 Dạng tốn Dãy có tổng S 18 3.3.4 Dạng toán Biến đổi xâu 22 3.3.5 Dạng toán Ghép cặp 30 Phần III KẾT LUẬN VÀ KIẾN NGHỊ 36 3.1 Kết luận 36 3.2 Kiến nghị 36 TÀI LIỆU THAM KHẢO 37 Phần I ĐẶT VẤN ĐỀ: Lý chọn đề tài: Chúng ta thấy Tin Học đƣợc ứng dụng vào hầu hết tất lĩnh vực sống đóng vai trò lớn phát triển xã hội Thấy đƣợc tầm quan trọng Tin học, giới nói chung Việt Nam nói riêng có đầu tƣ lớn cho lĩnh vực Đặc biệt giáo dục nâng cao dân trí Tin Học đào tạo nguồn nhân lực có chất lƣợng cao Phụ huynh hệ học sinh sau bắt đầu trọng chọn nghành nghề liên quan đến công nghệ thông tin nhiều Tuy nhiên hệ thống giáo dục nƣớc ta môn Tin học chƣa đƣợc quan tâm với tầm quan trọng Tin Học bị xem môn phụ trƣờng học dẫn đến học sinh đầu tƣ cho mơn học này, gây khơng khó khăn cho giáo viên nhà trƣờng đặc biệt chọn đội ngũ học sinh giỏi Mặt khác mơn Tin học có đặc thù riêng, học sinh giỏi thi chủ yếu chấm tự động phần mềm themis nên phụ thuộc lớn vào thời gian thực (thời gian chạy) chƣơng trình giới hạn độ lớn liệu mà tốn u cầu Vì lập trình ngồi việc ý đến giới hạn liệu tốn cần lựa chọn thuật tốn tối ƣu để đảm bảo yêu cầu toán đặt Vì để giải tốn Tin Học thƣờng phải xác định đƣợc: - Bài toán thuộc lớp - Sử dụng phƣơng pháp tối ƣu để giải Trong q trình nghiên cứu bồi dƣỡng học sinh giỏi chúng tơi gặp nhiều tốn dãy tốn xử lí xâu Đây nội dung phổ biến đề thi học sinh giỏi nội dung khó Với mong muốn tìm giải pháp tối ƣu cho tốn này, chúng tơi mạnh dạn trình bày sáng kiến kinh nghiệm: SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG ĐỂ GIẢI MỘT SỐ BÀI TỐN CĨ TÍNH TRUY HỒI TRONG NGƠN NGỮ LẬP TRÌNH C++ Mục tiêu, nhiệm vụ đề tài: Nhằm giúp học sinh đứng trƣớc toán, xác định đƣợc tốn áp dụng đƣợc quy hoạch động không cách giải cụ thể nhƣ nào, đánh giá, so sánh đƣợc thời gian thực chƣơng trình (độ phức tạp thuật tốn) Cách nhận diện lập công thức quy hoạch động Đối tƣợng nghiên cứu: Sử dụng phƣơng pháp quy hoạch động để giải số tốn có tính truy hồi C++ nhƣ: Tìm dãy con; đếm dãy con; Tính tổng dãy con; toán liên quan đến xâu nhƣ tìm xâu chung dài biến đổi xâu Phƣơng pháp nghiên cứu: Để trình bày sáng kiến kinh nghiệm sử dụng kết hợp nhiều phƣơng pháp nhƣ: Nghiên cứu tài liệu, nghiên cứu theo chuyên đề, thực nghiệm, so sánh, phân tích kết thực nghiệm, ý kiến đóng góp đồng nghiệp thực tiễn giảng dạy Phần II NỘI DUNG NGHIÊN CỨU: Cơ sở lý luận: Sự phát triển nhƣ vũ bão Tin học đóng góp lớn Tin học phát triển xã hội phủ nhận đƣợc, đặc biệt dịp dịch Covid 19 vai trò Tin học đƣợc khẳng định, ngƣời dân nói chung phụ huynh học sinh nói riêng nhìn thấy đƣợc vai trị quan trọng Tin học lĩnh vực kinh tế, văn hóa giáo dục Chắc chắn ngƣời có nhìn nhận khác thấy mơn Tin Học quan trọng Xã hội phát triển, đòi hỏi Tin học phát triển để đáp ứng nhu cầu xã hội Để đáp ứng đòi hỏi phát triển phải có kế hoạch đào tạo bồi dƣỡng cá nhân có niềm say mê có khiếu lĩnh vực tin học trang bị vốn kiến thức sở vững chắc, giúp cho mục tiêu trƣớc đón đầu, rút ngắn khoảng cách trình độ tin học nƣớc ta giới Trong trình nghiên cứu, giảng dạy, gặp nhiều tập toán tin Các tập dạng phong phú đa dạng Thực tế chƣa có thuật tốn hồn chỉnh áp dụng cho tốn Tuy nhiên ngƣời ta tìm số thuật toán chung nhƣ: tham lam, quay lui, quy hoạch động, giải thuật đồ thị Các thuật tốn áp dụng để giải lớp rộng toán hay gặp thực tế Trong q trình ơn thi học sinh giỏi trƣờng, việc truyền đạt kiến thức số thuật toán nhƣ: quay lui, quy hoạch động, tham lam, giải thuật đồ thị… cần thiết cho học sinh để phát triển tƣ lập trình giải tốn tin học Tạo lập củng cố lịng say mê tìm hiểu khám phá cho học sinh giải toán tin Trong q trình dạy bồi dƣỡng chúng tơi nhận thấy, học sinh thực tốt việc lựa chọn cài đặt chƣơng trình tối ƣu giải tập dãy tập xử lí xâu nói riêng tập lập trình nói chung chất lƣợng học sinh giỏi đƣợc nâng cao Thực trạng vấn đề nghiên cứu: Thực trạng dạy học môn Tin học trƣờng phổ thông Phan Đăng Lƣu nay: Hiện nhu cầu xã hội cần nhiều kĩ sƣ Công Nghệ Thông tin lao động có trình độ cao Tuy nhiên việc đào bồi dƣơng học sinh u thích mơn tin học trƣờng phổ thông gặp nhiều khó khăn - Mơn Tin học bị xem môn “phụ”, không tham gia thi tốt nghiệp hay đại học cao đẳng mơn Tin Học chƣa nhận đƣợc quan tâm nhà trƣờng nhƣ phụ huynh học sinh Mặt khác, để lập trình địi hỏi học sinh phải có kiến thức tốt, phải có khả tƣ đam mê Vì động viên tuyển chọn đƣợc em vào đội tuyển học sinh giỏi môn tin học trƣờng khó Trong thực trạng chúng tơi muốn tìm hiểu, nghiên cứu, truyền kinh nghiệm, hiểu biết để truyền lại đam mê cho học sinh ham thích mơn Tin học Nội dung vấn đề nghiên cứu: 3.1 Tên chủ đề: SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG ĐỂ GIẢI MỘT SỐ BÀI TỐN CĨ TÍNH TRUY HỒI TRONG NGƠN NGỮ LẬP TRÌNH C++ 3.2 Cơ sở lý thuyết: 3.2.1 Khái niệm phương pháp quy hoạch động: Các thuật tốn đệ quy có ƣu điểm dễ cài đặt, nhiên chất trình đệ quy, chƣơng trình thƣờng kéo theo địi hỏi lớn khơng gian nhớ khối lƣợng tính toán khổng lồ, nên thuật toán hiệu cần thiết Và trƣờng hợp nhƣ vậy, quy hoạch động thuật toán đƣợc lựa chọn nhiều Quy hoạch động (Dynamic programming) kỹ thuật nhằm đơn giản hóa việc tính tốn cơng thức truy hồi cách lưu trữ tồn hay phần kết tính tốn bước với mục đích sử dụng lại Bản chất quy hoạch động thay mơ hình tính tốn “từ xuống” (Top-down) mơ hình tính tốn “từ lên” (Bottom-up) Từ “programming” không liên quan tới việc lập trình cho máy tính, thuật ngữ mà nhà toán học hay dùng để bƣớc chung việc giải dạng toán hay lớp vấn đề Khơng có thuật tốn tổng qt để giải tất tốn quy hoạch động Mục đích phần cung cấp cách tiếp cận việc giải toán tối ƣu mang chất đệ quy, đồng thời đƣa ví dụ từ dễ đến khó để học sinh làm quen hình thành kỹ việc tiếp cận toán quy hoạch động 3.2.2 Các bước giải tốn quy hoạch động: Có bƣớc để giải toán quy hoạch động: Bước 1: Xây dựng hàm mục tiêu: Áp dụng nguyên lý tối ƣu Bellman ta phân rã toán ban đầu thành toán dạng có kích thƣớc nhỏ hơn, cho việc giải toán cấp phụ thuộc vào kết tốn trƣớc Bước 2: Xác định toán sở: Bài toán sở tốn nhỏ mà ta biết kết tính đƣợc kết dễ dàng Đây sở để tính nghiệm cho toán cấp lớn Bước 3: Xây dựng công thức truy hồi: Căn vào ý nghĩa hàm mục tiêu, tìm mối liên hệ tốn cấp, ta tiến hành xây dựng cơng thức tính kết tốn cấp i dựa vào kết toán cấp trƣớc Lời giải đƣợc lƣu vào mảng chiều mảng chiều (gọi bảng phƣơng án) Bước 4: Dựa vào bảng phƣơng án, truy vết để tìm phƣơng án tối ƣu 3.2.3 Biện pháp lựa chọn cài đặt chương trình: Khi dùng thuật tốn quy hoạch động: Phƣơng pháp quy hoạch động dùng để giải tốn tối ƣu có chất đệ quy, tức việc tìm phƣơng án tối ƣu cho tốn đƣa tìm phƣơng án tối ƣu số hữu hạn toán Đối với nhiều thuật tốn đệ quy tìm hiểu, nguyên lý chia để trị (divide and conquer) thƣờng đóng vai trị chủ đạo việc thiết kế thuật toán Để giải toán lớn, ta chia làm nhiều tốn dạng với để giải độc lập Trong phƣơng pháp quy hoạch động, nguyên lý đƣợc thể rõ: Khi cần phải giải toán nào, ta giải tất toán lƣu trữ lời giải hay đáp số chúng với mục đích sử dụng lại theo phối hợp để giải tốn tổng qt Đó điểm khác Quy hoạch động phép phân giải đệ quy nội dung phƣơng pháp quy hoạch động Phép phân giải đệ quy toán lớn phân rã thành nhiều toán giải tốn Việc giải toán lại đƣa phép phân rã tiếp thành nhiều toán nhỏ lại giải tiếp tốn nhỏ đƣợc giải hay chƣa Quy hoạch động việc giải tất toán nhỏ (bài tốn sở) để từ bƣớc giải toán lớn hơn, giải đƣợc toán lớn (bài toán ban đầu) Nhận thấy:  Trƣớc áp dụng phƣơng pháp quy hoạch động ta phải xét xem phƣơng pháp có thoả mãn yêu cầu dƣới hay không:  Bài toán lớn phải phân rã đƣợc thành nhiều toán con, mà phối hợp lời giải tốn cho ta lời giải tốn lớn  Vì quy hoạch động giải tất tốn con, nên khơng đủ không gian vật lý lƣu trữ lời giải (bộ nhớ, đĩa…) để phối hợp chúng phƣơng pháp quy hoạch động thực đƣợc  Quá trình từ tốn sở tìm lời giải toán ban đầu phải qua hữu hạn bƣớc Cài đặt chƣơng trình: Các bƣớc cài đặt chƣơng trình phƣơng pháp quy hoạch động Bước Giải tất tốn sở (thơng thƣờng dễ), lƣu lời giải vào bảng phƣơng án Bước Dùng công thức truy hồi phối hợp lời giải toán nhỏ lƣu bảng phƣơng án để tìm lời giải tốn lớn lƣu chúng vào bảng phƣơng án Cho tới tốn ban đầu tìm đƣợc lời giải Bước Dựa vào bảng phƣơng án, truy vết tìm nghiệm tối ƣu Các hƣớng thực quy hoạch động: - Quy hoạch động ngƣợc: Phƣơng pháp quy hoạch động ngƣợc phƣơng pháp đƣợc sử dụng rộng rãi, tƣơng ứng với suy nghĩ tự nhiên Chúng ta đọc đề bài, suy nghĩ cách giải cho Cách giải yêu cầu phải giải toán nhỏ hơn, nhƣ kiểu làm toán ngày phải chứng minh bổ đề Chúng ta tiếp tục suy nghĩ cho toán này, tổng hợp để tìm lời giải cho tốn lớn Quá trình tiếp tục nhƣ vậy, quy hoạch động kiểu “ngƣợc” đƣợc xây dựng nhƣ Ngồi ra, mặt lập trình, kiểu quy hoạch động có mối quan hệ tƣơng đối gần gũi với đệ quy Một toán lớn đƣợc giải dựa vào toán tƣơng tự (và tƣơng tự tốn lớn) việc áp dụng đệ quy phƣơng pháp dễ dàng để code Vì vậy, nhiều trƣờng hợp, coi quy hoạch động cách để tối ƣu phƣơng pháp đệ quy để giải tốn Ví dụ: Xâu chung dài Cho hai xâu ký tự Tìm độ dài xâu chung nhỏ chúng Ví dụ với xâu "quetzalcoatl" "tezcatlipoca" xâu chung dài "ezaloa" với độ dài Với toán này, lần lƣợt giải toán nhƣ sau: Lấy i ký tự từ xâu thứ j ký tự từ xâu thứ hai tìm độ dài xâu chung dài xâu đƣợc lấy Dễ dàng thấy đƣợc rằng, lời giải toán phụ thuộc vào i j, L(i, j) Và toán lớn đƣợc giải cách lần lƣợt giải toán lần lƣợt từ L(0, 0) tăng dần độ dài xâu đƣợc lấy lấy toàn xâu đề Chúng ta bắt đầu lần lƣợt toán Đƣơng nhiên, hai xâu rỗng xâu chung chúng rỗng Vậy L(0, j) = L(i, 0) = Nếu i j dƣơng, cần suy xét vài trƣờng hợp Nếu ký tự cuối xâu thứ mặt xâu chung dài nhất, bị bỏ qua mà khơng ảnh hƣởng đến kết Công thức L(i, j) = L(i - 1, j) Tƣơng tự nhƣ trƣờng hợp trên, ký tự cuối xâu thứ hai khơng ảnh hƣởng đến kết L(i, j) = L(i, j - 1) Trƣờng hợp cuối cùng, hai ký tự cuối hai xâu x1, x2 có mặt xâu chung dài Dĩ nhiên hai ký tự phải điều xảy ra, tức x1 == x2 Trong trƣờng hợp này, xoá ký tự hai ký tự khiến xâu chung dài ngắn ký tự Vậy rõ ràng L(i, j) = L(i - 1, j - 1) + Trong ba trƣờng hợp trên, phải chọn trƣờng hợp cho kết xâu chung dài (với tốn cần đƣa độ dài đủ) - Quy hoạch động xi: Ngồi kiểu quy hoạch động ngƣợc này, có kiểu quy hoạch động “xuôi” Tuy không phổ biến, kiểu quy hoạch động xuôi khó áp dụng, nhƣng quy hoạch động “xi” mang đến cho nhiều tiện lợi Kiểu xuôi cần duyệt qua toán từ nhỏ đến lớn, nhƣng với toán con, tính tốn kết từ tìm cách thực số phép tính để giải tốn lớn Nghĩa là, với toán con, nhìn phía trƣớc để xem phải giải toán nhƣ từ toán Phƣơng pháp khó áp dụng phƣơng pháp ngƣợc kia, khơng phải tốn áp dụng đƣợc Với toán, việc xác định bƣớc tƣơng đối khó khăn, chí việc kiểm tra tính sai phƣơng pháp không dễ dàng Nhƣ thấy phần trƣớc, thơng thƣờng, tốn cần phải giải cách tổng hợp kết từ vài tốn trƣớc Vì vậy, cách quy hoạch động xi sử dụng tốn để tính tốn trƣớc tốn cho phần kết kết cuối Vì vậy, để thực quy hoạch động xuôi, việc điền sẵn mảng giá trị trung tính điều bắt buộc (sau cộng dồn kết vào giải đƣợc tốn mới) Ví dụ: Xâu chung dài nhất: Với tốn này, chọn giá trị trung tính số âm Chúng ta tìm cách quy hoạch động xi nhƣ sau:  L(0,0) = toán với hai xâu rỗng Với toán L(i, j) tìm cách tính tốn kết cho tốn lớn Lúc này, có hƣớng phát triển tiếp:  Lấy thêm ký tự từ xâu thứ => Kết không thay đổi Lấy thêm ký tự từ xâu thứ hai => Kết không thay đổi Nếu ký tự hai xâu giống => Lấy tự từ độ dài xâu chung tăng lên 3.3 Các tập áp dụng: 3.3.1 Dạng tốn dãy liên tiếp: Mơ hình: Bài tốn điển hình: Cho dãy a1,a2, an (1 > n; int res=0; for (int i = 1; i > a[i]; L[1]=1; for (int i = 2; i

Ngày đăng: 02/07/2022, 19:35

HÌNH ẢNH LIÊN QUAN

Bảng phƣơng án là một mảng một chiề uL để lƣu trữ các giá trị của hàm QHĐ L[i]. Chƣơng trình tính các giá trị của mảng L nhƣ sau:   - SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG để GIẢI MỘT SỐ BÀI TOÁN CÓ TÍNH TRUY HỒI TRONG NGÔN NGỮ LẬP TRÌNH c++
Bảng ph ƣơng án là một mảng một chiề uL để lƣu trữ các giá trị của hàm QHĐ L[i]. Chƣơng trình tính các giá trị của mảng L nhƣ sau: (Trang 10)
Mô hình: Bài toán điển hình: - SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG để GIẢI MỘT SỐ BÀI TOÁN CÓ TÍNH TRUY HỒI TRONG NGÔN NGỮ LẬP TRÌNH c++
h ình: Bài toán điển hình: (Trang 12)
10cin>>n;  - SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG để GIẢI MỘT SỐ BÀI TOÁN CÓ TÍNH TRUY HỒI TRONG NGÔN NGỮ LẬP TRÌNH c++
10cin >>n; (Trang 12)
bảng xuống cò nS phần tử. - SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG để GIẢI MỘT SỐ BÀI TOÁN CÓ TÍNH TRUY HỒI TRONG NGÔN NGỮ LẬP TRÌNH c++
bảng xu ống cò nS phần tử (Trang 21)
Biến đổi xâu là một trong số bài toán điển hình minh họa dễ hiểu nhất cho việc sử dụng thuật toán quy hoạch động - SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG để GIẢI MỘT SỐ BÀI TOÁN CÓ TÍNH TRUY HỒI TRONG NGÔN NGỮ LẬP TRÌNH c++
i ến đổi xâu là một trong số bài toán điển hình minh họa dễ hiểu nhất cho việc sử dụng thuật toán quy hoạch động (Trang 24)
cout<<"\nSo buoc: "<<step<<"\n"; // in ra màn hình // Truy vết  - SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG để GIẢI MỘT SỐ BÀI TOÁN CÓ TÍNH TRUY HỒI TRONG NGÔN NGỮ LẬP TRÌNH c++
cout <<"\nSo buoc: "<<step<<"\n"; // in ra màn hình // Truy vết (Trang 27)
Để dễ hiểu hơn chúng ta xem hình minh họa dƣới đây: - SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG để GIẢI MỘT SỐ BÀI TOÁN CÓ TÍNH TRUY HỒI TRONG NGÔN NGỮ LẬP TRÌNH c++
d ễ hiểu hơn chúng ta xem hình minh họa dƣới đây: (Trang 29)
Truy vết để tìm và in ra xâu con ra màn hình sẽ dựa vào bảng kết quả mà ta tìm đƣợc ở phần trên - SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG để GIẢI MỘT SỐ BÀI TOÁN CÓ TÍNH TRUY HỒI TRONG NGÔN NGỮ LẬP TRÌNH c++
ruy vết để tìm và in ra xâu con ra màn hình sẽ dựa vào bảng kết quả mà ta tìm đƣợc ở phần trên (Trang 30)
Mô hình: Bài toán điển hình: (Olympic Quốc tế năm 1999.) - SỬ DỤNG PHƢƠNG PHÁP QUY HOẠCH ĐỘNG để GIẢI MỘT SỐ BÀI TOÁN CÓ TÍNH TRUY HỒI TRONG NGÔN NGỮ LẬP TRÌNH c++
h ình: Bài toán điển hình: (Olympic Quốc tế năm 1999.) (Trang 32)

TRÍCH ĐOẠN

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

TÀI LIỆU LIÊN QUAN

w