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

skkn vận dụng phương pháp qui hoạch động vào giải các bài toán trong ôn thi học sinh giỏi môn tin học

40 25 0
Tài liệu đã được kiểm tra trùng lặp

Đ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 đề Vận dụng phương pháp qui hoạch động vào giải các bài toán trong ôn thi học sinh giỏi môn Tin học
Tác giả Chu Thị Tú Anh
Trường học Trường Phổ Thông Dân Tộc Nội Trú Tỉnh
Chuyên ngành Tin học
Thể loại Sáng kiến
Năm xuất bản 2024
Thành phố Bắc Giang
Định dạng
Số trang 40
Dung lượng 1,21 MB

Cấu trúc

  • 1. Tên sáng kiến (3)
  • 2. Ngày sáng kiến được áp dụng lần đầu (3)
  • 3. Các thông tin cần bảo mật (3)
  • 4. Mô tả giải pháp cũ thường làm (3)
  • 5. Sự cần thiết phải áp dụng giải pháp sáng kiến (3)
  • 6. Mục đích của giải pháp sáng kiến (3)
  • 7. Nội dung (4)
    • 7.1 Thuyết minh giải pháp mới hoặc cải tiến (4)
      • 7.1.1 Cơ sở lý thuyết (4)
        • 7.1.1.1 Khái niệm qui hoạch động (4)
        • 7.1.1.2 Khi nào thì dùng thuật toán quy hoạch động (4)
        • 7.1.1.3 Phương pháp chung (5)
      • 7.1.2 Các bài toán áp dụng (5)
        • 7.1.2.1 Xâu con đối xứng dài nhất (5)
        • 7.1.2.2 Bài Phần thưởng (9)
        • 7.1.2.3 Bài Tặng quà (13)
        • 7.1.2.4 Bài toán Con Ếch (18)
        • 7.1.2.5 Bài Đường đi (20)
        • 7.1.2.6 Bài Nhảy trên các bậc thang (0)
        • 7.1.2.7 Bái toán ValiA (23)
        • 7.1.2.8 Bài toán cây khế (25)
        • 7.1.2.9 Bài toán Chia kẹo (27)
        • 7.1.2.10 Bài toán Bố trí phòng họp (30)
        • 7.1.2.11 Một số bài toán khác (33)
    • 7.2 Phạm vi áp dụng sáng kiến (39)
    • 7.3 Lợi ích kinh tế, xã hội của sáng kiến (39)
  • 8. Tài liệu tham khảo (40)

Nội dung

TRƯỜNG PHỔ THÔNG DÂN TỘC NỘI TRÚ TỈNH THUYẾT MINH MÔ TẢ GIẢI PHÁP VÀ KẾT QUẢ THỰC HIỆN SÁNG KIẾN Vận dụng phương pháp qui hoạch động vào giải các bài toán trong ôn thi học sinh giỏi môn

Tên sáng kiến

bài toán trong ôn thi học sinh giỏi môn Tin học”.

Mô tả giải pháp cũ thường làm

Trong các kì thi học sinh giỏi môn Tin học hay Tin học trẻ, các bài toán vận dụng phương pháp qui hoạch động để giải quyết là một dạng bài toán trong đề thi học sinh giỏi môn Tin học Đây là một dạng bài toán khó đối với các em học sinh THPT, khi gặp các bài toán này các em chưa xác định được dạng bài toán nên thường sử dụng các thuật toán đơn giản, dễ cài đặt tuy nhiên có độ phức tạp lớn, thường chỉ được ít điểm với một số bộ test có dữ liệu nhỏ Với các bộ test lớn các em học sinh sử dụng thuật toán như vậy thì chương trình sẽ bị mất điểm (do chạy quá thời gian qui định đối với các bộ test lớn hoặc tràn bộ nhớ), không đạt được số điểm tuyệt đối của bài Vậy làm thế nào để chương trình chạy đúng mà đảm bảo thời gian chạy chương trình theo qui định cho mỗi bộ test? Làm thế nào để lấy được điểm tuyệt đối với các bộ test có dữ liệu lớn?

Sự cần thiết phải áp dụng giải pháp sáng kiến

Qua việc áp dụng sáng kiến vào giảng dạy trong thực tế, giúp học sinh khá, giỏi rèn luyện kỹ năng lập trình, khơi dậy niềm say mê, yêu thích đối với bộ môn Tin học Với những dạng bài toán sử dụng phương pháp qui hoạch động, học sinh xác định được dạng bài toán và dựa vào cấu trúc dữ liệu biết lựa chọn thuật toán phù hợp để giải quyết bài toán một cách tối ưu, từ đó giúp học sinh đạt điểm tối đa trong các bài thi.

Mục đích của giải pháp sáng kiến

Sáng kiến này trình bày phương pháp giải bài toán thông qua các ví dụ cụ thể, giúp học sinh phân tích bài toán, nhận biết đâu là bài toán có thể vận dụng phương pháp quy hoạch động Từ đó, dựa vào cấu trúc dữ liệu bài toán, học sinh có thể lựa chọn thuật toán tối ưu, xây dựng trường hợp cơ sở và công thức truy hồi cho bài toán, nhằm mục đích sử dụng ít thời gian, tiết kiệm bộ nhớ và sử dụng ít phép toán Sau cùng, khi chạy chương trình với các bộ test lớn, kết quả thu được sẽ chính xác và thời gian chạy không vượt quá thời gian qui định.

Nội dung

Thuyết minh giải pháp mới hoặc cải tiến

7.1.1.1 Khái niệm qui hoạch động

Quy hoạch động (Dynamic Programming) là một phương pháp tối ưu trong đó bài toán lớn được phân chia thành các bài toán đơn giản hơn Sau đó, từ kết quả của bài toán đơn giản hơn, ta sẽ tính được kết quả của bài toán ban đầu

Thay vì gọi đệ quy, thuật toán sẽ tính toán lời giải của các bài toán con trước tiên và lưu vào mảng bộ nhớ Tiếp theo, sẽ dùng lời giải của bài toán con trong mảng đã tính trước đó để giải bài toán lớn theo công thức truy hồi Công thức truy hồi là công thức thể hiện quan hệ giữa các bước trong một bài toán và kết quả của bước sau nhờ vào kết quả của các bước trước đó

7.1.1.2 Khi nào thì dùng thuật toán quy hoạch động

Với những bài toán có tính chất nổi bật dưới đây thì chúng ta có thể nghĩ đến bài toán qui hoạch động:

Thứ nhất: Bài toán có các bài toán con gối nhau

Thứ hai: Bài toán có cấu trúc con tối ưu

Bài toán con gối nhau

Bài toán con gối nhau là bài toán nhỏ hơn và được chia từ bài toán ban đầu ra Việc sử dụng lặp lại nhiều lần này, thuật toán sẽ lưu kết quả mà không cần tính lại, giúp bạn tiết kiệm rất nhiều thời gian

Ví dụ bài toán dãy số Fibonacci: Dãy Fibonacci là dãy vô hạn các số tự nhiên bắt đầu bằng 1 và 1, sau đó các số tiếp theo sẽ bằng tổng của 2 số liền trước nó: Cho f(1)=f(2)=1; f(n)=f(n-1)+f(n-2) (n>2)

Bằng cách cộng số Fibonacci thứ n-1 và n-2 sẽ tính được số Fibonacci thứ n Bài toán con của số Fibonacci thứ n là bài toán tính số Fibonacci n-1 và n-2

Quy hoạch động là một phương pháp hiệu quả để tối ưu hóa bài toán bằng cách lưu trữ kết quả của các bài toán con Nhờ đó, chỉ cần tính toán mỗi bài toán con một lần, giúp giảm đáng kể thời gian tính toán tổng thể Đây là lý do tại sao quy hoạch động được sử dụng rộng rãi trong các cuộc thi lập trình, hỗ trợ các thí sinh tiết kiệm thời gian đáng kể.

Cấu trúc con tối ưu

Bài toán có cấu trúc con tối ưu là gì? Cấu trúc con tối ưu chính là tập hợp các lời giải tối ưu từ các bài toán con để tìm ra lời giải bài toán lớn Bài toán có cấu trúc con tối ưu có thể dễ dàng tính toán hoặc có khi không cần phải tính toán nữa Các bài toán con tối ưu có thể sử dụng công thức truy hồi đưa vào thuật toán để tìm ra đáp án cuối cùng cho bài toán

7.1.1.3 Phương pháp chung Để có thể giải được một bài toán quy hoạch động, chúng ta sẽ cần hai yếu tố cơ bản nhất đó là công thức truy hồi và trường hợp cơ sở

Ví dụ với bài toán về số Fibonacci, ta đã biết công thức truy hồi là: f(n)=f(n-1)+f(n-2)

Bản chất của công thức này là đệ quy Vậy thì nó sẽ đệ quy đến khi nào?

Ta cũng biết là f(1)=f(2)=1 nên khi n=1 hoặc n=2 thì ta lấy luôn kết quả f(n)=1, đây chính là trường hợp cơ sở

Như vậy, lời giải quy hoạch động của bài toán tìm số Fibonacci thứ n có thể biểu diễn như sau: f(n)=f(n-1)+f(n-2) với n>2 và f(1)=f(2)=1

Với những bài toán phức tạp thì công thức truy hồi sẽ không chỉ đơn giản là một công thức mà có thể là nhiều hàm, nhiều biến cùng được tính để cho ra kết quả

7.1.2 Các bài toán áp dụng

7.1.2.1 Xâu con đối xứng dài nhất

(Đề thi HSG cấp tỉnh năm 2018- 2019)

Cho xâu ký tự S, ta có thể lấy ra từ S các ký tự để tạo ra xâu con của nó Nếu ta lấy ra các ký tự liên tiếp nhau thì ta được xâu con các ký tự liên tiếp Ta cũng có thể lấy ra lần lượt các ký tự từ đầu xâu về cuối xâu ở vị trí bất kỳ và ghép chúng lại thành xâu theo thứ tự ấy, lúc đó ta được xâu con các ký tự ở vị trí bất kỳ Độ dài của xâu con cũng chính là số lượng ký tự trong xâu con Một xâu là đối xứng nếu đọc nó từ phải sang trái cũng thu được kết quả giống như đọc từ trái sang phải

Ví dụ: cho xâu S là „thi hsg tin hoc cap tinh‟, ta có xâu „hsg tin hoc‟ là một xâu con các ký tự liên tiếp, còn „thi tin hoc‟ là một xâu con các ký tự ở vị trí bất kỳ Xâu „xaxa‟ không phải là xâu đối xứng, xâu „xaax‟ là xâu đối xứng có độ dài là 4

Yêu cầu: Cho xâu S, hãy tìm xâu con đối xứng dài nhất?

Dữ liệu: vào từ tệp văn bản SUBSTR.INP ghi xâu S

Kết quả: ghi ra tệp văn bản SUBSTR.OUT gồm:

Dòng 1: ghi độ dài của xâu con đối xứng dài nhất gồm các ký tự liên tiếp; Dòng 2: ghi độ dài của xâu con đối xứng dài nhất gồm các ký tự ở vị trí bất kỳ

SUBSTR.INP SUBSTR.OUT Giải thích xaxaax 4

- Xâu con các ký tự liên tiếp đối xứng dài nhất: xaax (xaxaax)

- Xâu con các ký tự ở vị trí bất kỳ đối xứng dài nhất: xaxax (xaxaax, xaxaax) hoặc xaaax (xaxaax) Giới hạn:

Có 10/15 test có độ dài của xâu ≤ 200, tương ứng 2,0 điểm;

Có 5/15 test có 200 < độ dài của xâu ≤1000, tương ứng 1,0 điểm

- Tạo xâu P là xâu đảo ngược của xâu S ban đầu

- Xâu con chung của P và S chính là một xâu con đối xứng của S

- Tìm xâu con chung độ dài lớn nhất của P và S

Gọi F[i,j] là số độ dài lớn nhất của xâu con chung gồm các ký tự P[1], P[2], , P[i] và S[1], S[2], , S[N] khi đó:

#include using namespace std; typedef long long ll; typedef pair ii; typedef unsigned long long ull; mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); ll Rd(ll l,ll r)

{ return uniform_int_distribution(l,r)(rng);

#define IOS ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); const int maxn6+7; const int base1; const ll Mod00000007; int n; string S,T; ll hS[maxn],pS[maxn],hT[maxn],pT[maxn]; ll f[1005][1005]; ll gethS(ll l,ll r){ return (hS[r]-hS[l-1]*pS[r-l+1] + Mod*Mod)%Mod;

} ll gethT(ll l,ll r){ return (hT[r]-hT[l-1]*pT[r-l+1] + Mod*Mod)%Mod;

{ freopen("SUBSTR.INP","r",stdin); freopen("SUBSTR.OUT","w",stdout); getline(cin,S); n=S.length();

{ hS[i]=(hS[i-1]*base + S[i]-'a'+1)%Mod; hT[i]=(hT[i-1]*base + T[i]-'a'+1)%Mod; pS[i]=(pS[i-1]*base)%Mod; pT[i]=(pT[i-1]*base)%Mod;

FOR(j,i,n){ if(gethS(i,j)==gethT(n-j+1,n-i+1)) res1=max(res1,j- i+1*1ll);

(Đề thi HSG cấp tỉnh năm học 2019- 2020)

Trong cuộc thi lập trình APOLO do công ty GRIS tổ chức, Tuấn đạt được danh hiệu “Coder xuất sắc” Nhà tài trợ Bin Gate cho phép Tuấn được tự lựa chọn phần thưởng cho mình Trên khán đài xếp một dãy 𝑛 hộp quà được đánh số thứ tự từ 1 đến n, mặt trước của hộp quà i ghi một số nguyên dương ai tương ứng với giá trị của món quà chứa trong nó, nghĩa là a i càng lớn thì món quà càng có giá trị cao Tuấn được phép chọn các hộp quà tuỳ ý trong n hộp quà, tuy nhiên Tuấn không được phép chọn 𝑘 hộp quà liền nhau, đó là thử thách nhỏ của nhà tài trợ

Yêu cầu: Bạn hãy cho biết Tuấn có thể chọn những hộp quà nào để tổng giá trị của các hộp quà mà Tuấn chọn là lớn nhất?

Dữ liệu: Vào từ file văn bản BONUS.INP

 Dòng 1 chứa hai số nguyên n và k (1≤ 𝑛 ≤ 10 6 ;2 ≤ 𝑘 ≤ 10 6 );

 Dòng 2 chứa n số nguyên dương a1, a2, …, a n tương ứng là giá trị của n hộp quà của nhà tài trợ theo thứ tự liệt kê từ hộp quà thứ nhất tới hộp quà thứ 𝑛

Kết quả: Ghi ra file văn bản BONUS.OUT một số duy nhất là tổng giá trị lớn nhất của các hộp quà mà Tuấn có thể nhận được

Lưu ý: Các số nằm trên cùng một dòng trong các tệp dữ liệu vào được đặt cách nhau dấu cách

Có 20/40 test với 1 < n, k < 1000, tương ứng 1,5 điểm;

Có 20/40 test với 1000 < n, k < 10 6 , tương ứng 1,5 điểm;

Gọi L[i] là tổng tiền tố của mảng a trong đoạn [1 n]

Gọi f[i] là tổng giá trị lớn nhất của các hộp quà mà Tuấn chọn, p[i] là tổng giá trị của các hộp quà mà Tuấn không chọn khi xét đến i

- Nếu i= k: duyệt i = k -> n : p[i] = L[i]-f[i-1]: tổng giá trị của các hộp quà tuấn không chọn trong đoạn [1,i]

Gọi t là giá trị nhỏ nhất của các hộp quà mà Tuấn không chọn trong đoạn [i-k+1 i].=> f[i] = max(f[i],L[i]-t)=> đáp án bài toán là f[n]

* sub2 (1000 < n, k

Ngày đăng: 29/07/2024, 18: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