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

Một số bài toán quy hoạch động về dãy con nhằm bồi dưỡng học sinh giỏi tin học 11

19 34 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 19
Dung lượng 48,07 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Chúng ta biết rằng để có kết quả cao trong công tác bồi dưỡng HSG thì học sinh không những phải nắm chắc các kiến thức mà còn phải biết được các phương pháp, thuật toán để giải được các

Trang 1

1 MỞ ĐẦU

1.1 Lý do chọn đề tài

Một trong những tiêu chí để đánh giá chất lượng một trường THPT là tỷ

lệ đạt học sinh giỏi của trường so với mặt bằng chung của tỉnh, của cả nước Chúng ta biết rằng để có kết quả cao trong công tác bồi dưỡng HSG thì học sinh không những phải nắm chắc các kiến thức mà còn phải biết được các phương pháp, thuật toán để giải được các bài toán khó, nâng cao

Nội dung tin học lập trình lớp 11 là một nội dung mới lạ đối với đa số học sinh với nhiều khái niệm, thuật ngữ, cấu trúc dữ liệu mà học sinh mới được tiếp xúc lần đầu Vì vậy ngôn ngữ lập trình đòi hỏi học sinh phải làm quen với nhiều kiểu dữ liệu, để giải các bài toán trong Tin học thì việc xác định thuật toán để giải các bài toán là công việc hết sức quan trọng Tuy nhiên, đối với học sinh việc thiết kế thuật toán nhằm giải quyết tối ưu bài toán còn gặp nhiều khó khăn

Qua thực tế công tác giảng dạy hơn 10 năm ở trường, qua học hỏi kinh nghiệm từ đồng nghiệp và qua nhiều lần đứng đội tuyển tôi nhận thấy rằng trong các đề thi HSG Tin học cấp tỉnh có một số bài toán cần sử dụng kỹ thuật lập trình cao Tuy có nhiều cách để giải quyết nhưng với mỗi bài toán nâng cao đó đều có giới hạn về thời gian cũng như bộ nhớ của chương trình nên nếu không lựa chọn thuật toán hiệu quả học sinh dễ dàng mất điểm các Test Và trong những bài toán nâng cao như vậy thì việc lựa chọn một thuật toán hiệu quả là vô cùng quan trọng Vì vậy, tôi đã nghiên cứu một chuyên đề các bài toán về dãy con trong đó có sử dụng phương pháp quy hoạch động nhằm đem lại kết quả tối

ưu cho bài toán và đề tài tôi chọn là: “Một số bài toán quy hoạch động về dãy con nhằm bồi dưỡng học sinh giỏi Tin học lớp 11”

1.2 Mục đích nghiên cứu

Nhằm giúp học sinh giỏi lựa chọn được thuật toán tối ưu nhất để giải và cũng góp thêm vào ngân hàng lượng bài tập nhằm hỗ trợ thêm cho công tác bồi dưỡng học sinh giỏi

Đưa ra thuật toán để giải quyết các bài toán cơ bản về phương pháp quy hoạch động, nâng cao khả năng tư duy sáng tạo cho học sinh, nâng cao chất lượng học sinh giỏi Nêu vấn đề, phân dạng các bài toán tin học có liên quan, thực hiện ví dụ minh họa, đưa ra thuật toán và viết Code chương trình tham khảo cho mỗi bài toán đó để học sinh quan sát qua đó nắm vững kiến thức về phương pháp quy hoạch động Cũng thông qua đề tài nhằm cung cấp thêm một phương pháp tư duy, tiếp cận để giải các bài toán trong bồi dưỡng HSG cấp tỉnh

1.3 Đối tượng nghiên cứu

- Môn Tin học lớp 11 ở trường THPT

- Học sinh khá, giỏi khối 11 trường PT Nguyễn Mộng Tuân

- Nghiên cứu lí luận về bài tập giải bài toán bằng phương pháp quy hoạch động trong dạy học bồi dưỡng học sinh giỏi.

Trang 2

1.4 Phương pháp nghiên cứu

- Hình thành ở học sinh kỹ năng phân tích, xử lý các vấn đề liên quan đến các bài toán về quy hoạch động

- Xây dựng qui trình giảng dạy với bài tập sử dụng phương pháp quy hoạch động trong việc tích cực hóa hoạt động nhận thức cho học sinh

- Đánh giá, so sánh kết quả của học sinh

Để trình bày sáng kiến kinh nghiệm này, tôi đã sử dụng phối kết hợp nhiều phương pháp như: nghiên cứu tài liệu, sách, báo, thông qua mạng, tham khảo ý kiến của cấp trên và đồng nghiệp, điều tra cơ bản, thực nghiệm so sánh, phân tích kết quả thực nghiệm phù hợp với môn học thuộc lĩnh vực Tin học

2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 Cơ sở lý luận của sáng kiến kinh nghiệm

Trong quá trình học tập, chúng ta gặp rất nhiều các bài tập về Toán -Tin Khi nào thì chúng ta cần đến quy hoạch động? Không có một công thức nào cho các bài toán như vậy Tuy nhiên, có một số tính chất của bài toán mà có thể nghĩ đến quy hoạch động Dưới đây là hai tính chất nhấn mạnh nhất:

- Bài toán có các bài toán con gối nhau

- Bài toán có cấu trúc con tối ưu

Các bài tập dạng này rất phong phú và đa dạng Thực tế chưa có thuật toán hoàn chỉnh có thể áp dụng cho mọi bài toán Tuy nhiên, người ta đã tìm ra một số thuật toán chung như chia để trị, tham ăn, quay lui, Các thuật toán này

có thể áp dụng để giải một lớp khá rộng các bài toán hay gặp trong thực tế Trong bài viết này, tôi muốn đề cập với các bạn một thuật toán khác, đó là thuật toán quy hoạch động

Để giải một bài toán ta chia bài toán đó thành các bài toán nhỏ hơn có thể giải một cách dễ dàng Sau đó kết hợp lời giải các bài toán con, ta có được lời giải bài toán ban đầu Trong quá trình giải các bài toán con đôi khi ta gặp rất nhiều kết quả trùng lặp của các bài toán con Để tăng tính hiệu quả, thay vì phải tính lại các kết quả đó, ta lưu chúng vào một bảng Khi cần lời giải của một bài toán con nào đó ta chỉ cần tìm trong bảng, không cần tính lại

Tư tưởng của thuật toán quy hoạch động khá đơn giản Tuy nhiên khi áp dụng thuật toán vào trường hợp cụ thể lại không dễ Khi giải bài toán bằng phương pháp này, chúng ta phải thực hiện hai yêu cầu quan trọng sau:

- Tìm công thức truy hồi xác định nghiệm bài toán qua nghiệm các bài toán con nhỏ hơn

Trang 3

- Với mỗi bài toán cụ thể, ta đề ra phương án lưu trữ nghiệm một cách hợp lý để từ đó có thể truy cập một cách thuận tiện nhất

Căn cứ vào việc lựa chọn đội tuyển dự thi học sinh giỏi của nhà trường,

để đội ngũ học sinh giỏi của trường PT Nguyễn Mộng Tuân ngày càng đạt kết quả cao hơn Giúp cho học sinh chuyên tin khối THPT thi đạt kết quả ngày càng cao, tạo ra nguồn tài liệu tham khảo về thuật toán hỗ trợ cho giáo học sinh và giáo viên dạy đội tuyển học sinh giỏi trong nhà trường

2.2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm

Trong quá trình bồi dưỡng học sinh giỏi Tin học lớp 11 có nhiều bài toán

có thể sử dụng nhiều thuật toán giải khác nhau Nhưng khi chưa áp dụng phương pháp quy hoạch động thì các bài toán đó khi Test không lấy được hết điểm Thuật toán không tối ưu, quá thời gian Đây cũng là khó khăn đối với học sinh vì các em chưa được làm quen nhiều với các bài tập thiết kế thuật toán bằng phương pháp quy hoạch động

Qua việc giảng dạy học sinh khá, giỏi ôn thi học sinh giỏi Tin 11, tôi nhận thấy việc hệ thống các bài tập theo từng chuyên đề có sử dụng phương pháp quy hoạch động để học sinh tham khảo và luyện đề là hết sức quan trọng và có tính hiệu quả cao

2.3 Giải pháp đã sử dụng để giải quyết vấn đề

2.3.1.Phương pháp quy hoạch động

a Tư tưởng của phương pháp

Quy hoạch động (Dynamic Programming) là một phương pháp rất hiệu

quả để giải nhiều bài toán tin học, đặc biệt là những bài toán tối ưu, có một số bà toán sử dụng phương pháp quy hoạch động lại cho hiệu quả cao hơn hẳn so với nhiều phương pháp khác Số lượng các bài thi có thể áp dụng phương pháp quy hoạch động để giải trong đề thi học sinh giỏi môn Tin học thường rất cao

Trong các phương pháp để giải một bài toán lập trình thì quy hoạch động

là phương pháp giảm thời gian chạy của các thuật toán thể hiện các tính chất của bài toán con gối nhau và cấu trúc con tối ưu Cấu trúc con tối ưu có nghĩa là các lời giải tối ưu cho các bài toán Có thể giải một bài toán với cấu trúc con tối ưu bằng một quy trình ba bước:

- Bước 1: Chia bài toán thành các bài toán con nhỏ hơn

- Bước 2: Giải các bài toán này bằng cách tối ưu bằng cách sử dụng đệ quy theo quy trình ba bước này

- Bước 3: Sử dụng các kết quả tối ưu để xây dựng một lời giải tối ưu cho bài toán ban đầu

Các bài toán con được giải bằng cách chia chúng thành các bài toán nhỏ hơn và cứ tiếp tục như thế cho đến khi ta đến được trường hợp đơn giản dễ tìm cho lời giải

Một bài toán có các bài toán con trùng nhau nghĩa là một bài toán con đó được sử dụng để giải nhiều bài toán lớn hơn khác nhau Ví dụ trong dãy Fibonaci, F3=F1+F2 và F4=F2+F3 khi tính mỗi số đều phải tính F2 Khi tính F5 thì

Trang 4

cần đến F3 và F4 Như vậy tính F5 có thể tính F2 hai lần hoặc nhiều hơn Điều này

áp dụng mỗi khi có các bài toán con gối nhau giúp cho bài toán được tối ưu và thời gian chạy chương trình cũng nhanh hơn

- Trong phương án quy hoạch động, nguyên lý chia để trị càng được thể hiện rõ: Khi không biết phải giải quyết những bài toán con nào, ta sẽ đi giải quyết toàn bộ các bài toán con và lưu trữ những lời giải hay đáp số của chúng với mục đích sử dụng lại theo một sự phối hợp nào đó để giải quyết những bài toán tổng quát hơn

- Quy hoạch động bắt đầu từ việc giải tất cả các bài toán nhỏ nhất (bài toán cơ sở) để từ đó từng bước giải quyết nhưng bài toán lớn hơn, cho tới khi giải được bài toán lớn nhất (bài toán ban đầu) Quá trình từ bài toán cơ sở tìm ra lời giải bài toán ban đầu phải qua hữu hạn bước Các bước cài đặt một chương trình sử dụng quy hoạch động:

+ Giải tất cả các bài toán cơ sở (thông thường rất dễ), lưu các lời giải vào bảng phương án

+ Dùng công thức truy hồi phối hợp những lời giải của các bài toán nhỏ

đã lưu trong bảng phương án để tìm lời giải của các bài toán lớn hơn rồi lưu chúng vào bảng phương án Cho tới khi bài toán ban đầu tìm được lời giải

+ Dựa vào bảng phương án, truy vét tìm ra nghiệm tối ưu

+ Cho tới nay, vẫn chưa có một định lý nào cho biết một cách chính xác những bài toán nào có thể giải quyết hiệu quả bằng quy hoạch động Tuy nhiên

để biết được bài toán có thể giải bằng quy hoạch động hay không, ta có thể đặt câu hỏi:

+ Liệu có thể nào lưu trữ được nghiệm các bài toán con dưới một hình thức nào đó để phối hợp tìm được nghiệm bài toán lớn?

+ Nhìn chung thường các bài toán tối ưu được giải bằng phương pháp truy hồi thường được giải bằng phương pháp quy hoạch động độ phức tạp thuật toán nhỏ hơn

b Các bước thực hiện quy hoạch động

Các bước cơ bản để giải một bài toán tối ưu bằng quy hoạch động:

- Bước 1: Lập hệ thức:

Dựa vào nguyên lý tối ưu tìm cách chia quá trình giải bài toán thành từng giai đoạn, sau đó tìm hệ thức biểu diễn tương quan quyết định của bước đang xử

lý với các bước đã xử lý trước đó Hoặc tìm cách phân rã bài toán thành các bài toán con tương tự có kích thước nhỏ hơn, tìm hệ thức nêu quan hệ giữa kết quả bài toán kích thước đã cho với các kết quả của bài toán con cùng kiểu có kích thước nhỏ hơn nhằm sử dụng các hàm hoặc thủ tục đệ quy

Cách xây dựng hàm:

Chia việc giải bài toán thành n giai đoạn, mỗi giai đoạn i có trạng thái ban đầu là t(i) và chịu tác động đến d(i) sẽ biến trạng thái tiếp theo t(i+1) của giai đoạn i+1 (i=1,2, ,n-1) Theo nguyên lý tối ưu của Bellman việc tối ưu giai đoạn cuối cùng không làm ảnh hưởng đến kết quả của bài toán Với trạng thái ban đầu

là t(n), sau khi làm giai đoạn n tốt nhất ta có trạng thái của n-1 là t(n-1) và tác động điều khiển của giai đoạn n-1 là d(n-1) Sau khi tối ưu giai đoạn n-1 ta lại có

Trang 5

t(n-2) và có thể tối ưu giai đoạn n-2 cho đến khi các giai đoạn từ n giảm đến 1 được tối ưu thì coi như hoàn thành bài toán Gọi i giá trị tối ưu của bài toán tính đến giai đoạn k là Fk, giá trị tối ưu của bài toán tính riêng ở giai đoạn k là Gk thì Fk=Fk-1+Gk hay ta có công thức sau:

Fk(t(k))=max{Gk(t(k),d(k))+Fk-1(t(k-1))}(*)

- Bước 2: Tổ chức dữ liệu và chương trình

Các giá trị của Fk thường được lưu trữ trong một bảng (mảng một chiều hoặc mảng hai chiều) Cần lưu ý khi khởi tạo giá trị ban đàu của bảng cho thích hợp, đó là các kết quả của bài toán con có kích thước nhỏ nhất của bài toán đang giải

Fk(t(1))=max{Gt(t(1),d(1))+F0(t(0))}

Dựa vào hệ thức (*) và các giá trị đã có trong bảng để tìm dần các giá trị còn lại của bảng Ngoài ra, cần mảng lưu trữ nghiệm tương ứng với giá trị tối ưu trong từng giai đoạn

- Bước 3: Truy vét, tìm nghiệm của bài toán dựa vào bảng phương án

Dựa vào bảng lưu trữ nghiệm và bảng giá trị tối ưu từng giai đoạn đã xây dựng tìm ra kết quả bài toán Làm tốt thuật toán bằng cách thu gọn hệ thức (*)

và giảm kích thước miền nhớ Thường tìm cách dùng mảng một chiều thay cho mảng hai chiều nếu giá trị một dòng (hoặc cột) của mảng hai chiều chỉ phụ thuộc một dòng (hoặc cột) kề trước

2.3.2 Các bài toán quy hoạch động về dãy con

a Bài toán 1: Dãy con tăng dài nhất liên tiếp

Cho dãy gồm N số nguyên a[1],a[2], ,a[n] Một dãy được gọi là dãy con của N gồm K phần tử liên tiếp là dãy: a[i],a[i+1],a[i+2], ,a[i+k-1]

Hãy tìm dãy con tăng liên tiếp dài nhất

Dữ liệu vào: tệp văn bản BAI1.INP có cấu trúc như sau:

+ Dòng 1 chứa số nguyên N (N<=1000)

+ Dòng thứ hai ghi N số nguyên là các số hạng trong dãy có giá trị tuyệt đối <=1000, mỗi số cách nhau một dấu cách

Dữ liệu ra: ghi ra tệp BAI1.OUT là dãy con tăng liên tiếp dài nhất của dãy

Ví dụ:

7

1 2 4 3 5 7 9

3 5 7 9

Phân tích thuật toán:

Ta xây dựng bảng phương án F: Với F[j] là độ dài dãy tăng dài nhất từ a[i] bắt đầu của dãy tăng tính tới phần tử a[j]

Trang 6

- Khi đó F[0]

- F[1]=1;

- F[2]=1 Nếu a[2]<a[1]

- F[2]=2=F[1]+1 nếu a[2]>=a[1]

- F[3]=1 nếu a[3]<a[2]

- F[3]=3=F[2]+1 nếu a[3]>=a[2]

- ……

- Như vậy: F[i]=1 nếu a[i]<a[i-1]

F[i]=F[i-1]+1 nếu a[i]>=a[i-1]

- Tại mỗi F[i] ta ghi nhận Dmax độ dài lớn nhất, và Dmax cuối cùng sẽ là kết quả bài toán

Code Pascal tham khảo:

Procedure Res;

Var F:array[0 Nmax] of longint;

i,Dmax:longint;

Begin

F[1]:=1;Dmax:=1;

for i:=2 to n do

begin

if a[i]>a[i-1] then F[i]:=f[i-1]+1

Dmax:=max(Dmax,F[i]);

end;

if Dmax=1 then write(-1)

else write(Dmax);

End;

b Bài toán 2 : Dãy con đơn điệu tăng

Cho một dãy số nguyên gồm N phần tử a1, a2, a3, …,aN

Biết rằng dãy con tăng đơn điệu là 1 dãy a[i1], a[i2], …, a[ik] thỏa mãn:

+ i1< i2 < ik

+ a[i1]<a[i2]<a[i3]< …<a[ik]

Yêu cầu: Hãy cho biết dãy con tăng đơn điệu dài nhất của dãy này có bao nhiêu phần tử?

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

- Dòng 1: Chứa số n (0<N≤ 1000)

- Dòng 2: Chứa n số a1, a2, …,aN đôi một khác nhau và cách nhau ít nhất một dấu cách ( |ai|≤10000)

Kết quả: Ghi ra file văn bản BAI2.OUT gồm một dòng ghi độ dài dãy

con tăng đơn điệu dài nhất

Ví dụ:

10

3 4 5 6 8 2 2 1 9 8

6

Phân tích thuật toán:

Trang 7

- Gọi L(i) là độ dài dãy con tăng dài nhất, các phần tử lấy trong miền từ a1

đến ai và phần tử cuối cùng là ai Dãy con đơn điệu tăng dài nhất kết thúc tai ai sẽ được thành lập bằng cách:

- Kiểm tra xem có bao nhiêu dãy con đơn điệu tăng (các phần tử trong miền từ a1 đến ai-1) mà ta có thể ghép ai vào cuối dãy đó

- Chọn dãy con đơn điệu có độ dài lớn nhất để ghép ai vào

Ta có công thức quy hoạch động để tính L(i) như sau:

• L(1) = 1

• L(i) = max(1, L(j)+1 với mọi phần tử j: 0 < j < i và aj < ai) Tính L(i) : phần tử đang được xét là ai Ta tìm đến phần tử aj < ai có L(j) lớn nhất Khi đó nếu bổ sung ai vào sau dãy con a1 aj ta sẽ được dãy con tăng dần dài nhất xét từ a1 ai

* Xây dựng bảng phương án:

- Xét mảng A cho trước và mảng L là mảng lưu lại độ dài tốt nhất tại thời điểm ta xét

- Tại thời điểm đầu tiên, khi mảng A có 1 phần tử thì độ dài tốt nhất lưu lại tại thời điểm xét đó là max=1

- Xét chạy đến phần tử kế tiếp theo nếu các giá trị trước đó nhỏ hơn số đang xét thì độ dài lớn nhất của chuỗi=max+1

- Còn khi xét chạy từ phần tử đầu đến phần tử đang xét không có giá trị nào nhỏ hơn phần tử xét thì max:=0+1

Minh họa ví dụ trên qua lập bảng phương án như sau:

n=10

L=6 là độ dài dãy con tăng đơn điệu dài nhất

Code Pascal tham khảo:

Const fi=’BAI2.INP’;

fo=’BAI2.OUT’;

var a,f:array[1 1000] of integer;

h, i,j,n,max:integer; tg,cs:string;

BEGIN

assign(input,fi);reset(input);

assign(output,fo');rewrite(output);

readln(fi,n);

for i:=1 to n do read(fi,a[i]);

f[1]:=1;

for i:=2 to n do

f[i]:=1;

for j:=1 to i-1 do

Trang 8

if (a[i]>a[j]) and (f[i]<f[j]+1) then f[i]:=f[j]+1;

if max<f[i] then max:=f[i];

end;

writeln(output,max);

close(input);close(output);

END

c Bài toán 3: Dãy con tăng dài nhất không liên tiếp

Cho dãy số nguyên A1,A2,…,An Hãy tìm một dãy con đơn điệu tăng của dãy A có độ dài lớn nhất (N<=10000)

Dữ liệu vào từ tệp văn bản BAI3.INP có cấu túc như sau:

+ Dòng 1: chứa số nguyên N

+ Dòng 2: ghi N số nguyên là các số trong dãy số, mỗi số cách nhau một dấu cách

Dữ liệu ra: tệp văn bản BAI3.OUT là một dãy con đơn điệu tăng của dãy

có độ dài lớn nhất (dãy con không liên tiếp tăng dài nhất)

Ví dụ:

12

6 12 8 11 3 4 1 7 5 9 10 2

3 4 7 9 10

Phân tích thuật toán:

- Dùng mảng L[i] để lưu độ dài dãy con đơn điệu tăng dài nhất có các phần tử từ 1 đến a[i]

- L[i] = 1 nếu không tồn tại j = 1 i-1 để a[j] < a[i]

- L[i] = max { L[i], j = 1 i-1 thỏa mãn a[j] < a[i]} + 1

Code Pascal tham khảo:

Cài đặt: dùng mảng T[i] để lưu vết

Trang 9

for i:=1 to n do T[i] := i;

L[1] := 1;

for i:=1 to n do

L[i] := 1;

For j := 1 to i - 1 do

if (a[i] >= a[j]) then

if (L[j] + 1 > L[i]) then begin L[i] := L[j] + 1; T[i] := j; end;

kq:=0;

for i:=1 to n do

if L[i] > kq then begin kq := L[i]; luu := i; end;

dem := 0;

while(T[luu] <> luu) do

begin inc(dem); k[dem] := luu; luu := T[luu] end;

inc(dem); k[dem] := luu;

// in ket qua

writeln(kq);

for i := dem downto 1 do write(k[i]:5);

Bài toán 4: Tìm độ dài dãy đan dấu không liên tiếp dài nhất, với dạng bài xuất dãy đan dấu dài nhất.

Phân tích thuật toán:

- Trước hết ta hiểu dãy đan dấu là dãy không có hai phần tử cạnh nhau có

dấu giống nhau

- Sử dụng phương pháp quy hoạch động

- Gọi F[i-1] là độ dài dãy con đan dấu dài nhất xét ở phần tử A[i-1]

- Khi xét tới A[i] để F[i] lớn nhất khi đó sẽ chọn ra F[j] với j=(1 i-1) lớn nhất có thể ghép được với A[i] hay chọn ra Max(F[j]) để ghép thêm A[i] vào với A[j] để tạo dãy đan dấu dài nhất

Trang 10

A[i] được xác định như sau:

• A[i]=1 nếu nó không ghép được với A[j]

• A[i]=1+Max(A[j]) Với j=(1 i-1)

Code Pascal tham khảo:

Procedure Res;

Var i,j,dmax:longint;

Begin

F[1]:=1;Dmax:=1;

For i:=2 to n do

begin

f[i]:=1;

for j:=1 to i-1 do

if (a[i]*a[j]<0) then

begin

f[i]:=max(f[i],f[j]+1);

Dmax:=max(dmax,F[i]);

end;

If dmax=1 then write(-1)

else Write(dmax);

End;

e Bài toán 5: Dãy con liên tiếp dài nhất có tổng bằng 0

Cho dãy A gồm N số nguyên a1a2……an (N<100000) Hãy in ra dãy con liên tiếp dài nhất trong dãy cho trước mà có tổng =0 (│ai│<109)

Ví dụ:

5

2 1 -2 3 -2

1 -2 3 -2

Phân tích thuật toán:

Phương pháp QHĐ ( Độ dài dãy con dài nhất)

• F[i] là tổng các phần tử từ a[1] tới a[i]

• Tìm các F[i]=0 => dạy có độ dài là d=i

• Tìm các cặp F[i]=F[j] => dãy có độ dài là d=j-i+1

=> Tìm Max(các d) là là độ dài dãy con dài nhất

Code Pascal tham khảo:

Procedure Res;

Var dmax,i,j:longint;

Begin

f[1]:=a[1];

For i:=2 to n do f[i]:=f[i-1]+a[i];

Dmax:=0;

For i:=1 to n do

Ngày đăng: 19/05/2021, 20:57

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w