Giải pháp dùng quy hoạch động để giải một số dạng bài tập về dãy con tăng liên tiếp dài nhất

22 89 0
Giải pháp dùng quy hoạch động để giải một số dạng bài tập về dãy con tăng liên tiếp dài nhất

Đ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

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ TRƯỜNG THPT HÀ TRUNG SÁNG KIẾN KINH NGHIỆM GIẢI PHÁP DÙNG QUY HOẠCH ĐỘNG ĐỂ GIẢI MỘT SỐ DẠNG BÀI TẬP VỀ DÃY CON TĂNG LIÊN TIẾP DÀI NHẤT Người thực hiện: Lê Thùy Giang Chức vụ: Giáo viên SKKN thuộc lĩnh vực (mơn): Tin học THANH HỐ, NĂM 2020 MỤC LỤC MỞ ĐẦU 1 Lý chọn đề tài 1.2 Mục đích nghiên cứu 1.3 Đối tượng nghiên cứu 1.4 Phương pháp nghiên cứu 2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 Cơ sở lý luận sáng kiến kinh nghiệm 2.2 Thực trạng vấn đề trước áp dụng sáng kiến kinh nghiệm 2.3 Các giải pháp sử dụng để giải vấn đề đặt 2.3.1 Phần lý thuyết 2.3.2 Phần tập KẾT LUẬN, KIẾN NGHỊ 18 3.1 Kết luận 18 3.2 Kiến nghị 19 MỞ ĐẦU 1 Lý chọn đề tài Trường PHTP Hà Trung với 60 năm xây dựng trưởng thành khẳng định vị với trường bạn huyện Hà Trung nói riêng tỉnh nói chung Kết thi học sinh giỏi cấp tỉnh mơn văn hố hàng năm tỉnh Thanh Hố tiêu chí lớn để xét thành tích trường năm học đó.Trường THPT Hà Trung nằm tốp 15 tỉnh kết thi học sinh giỏi mơn văn hố Tuy nhiên chất lượng học sinh giỏi môn Tin học trường cịn chưa cao, phần lực học sinh, phần phương pháp giảng dạy giáo viên ôn đội tuyển chưa phù hợp với học sinh Do vậy, việc nâng cao chất lượng học sinh giỏi môn Tin học cần thiết cấp bách nhằm góp thêm vào thành tích chung nhà trường Trong đề thi học sinh giỏi môn Tin học năm, dạng tập dãy dạng tập khó thường xuất Khi gặp dạng tập này, nhiều học sinh không làm làm điểm không đạt tối đa Nguyên nhân chương trình chạy cho kết sai chương trình cho kết với test có liệu nhỏ, cịn test có liệu lớn chương trình chạy thời gian quy định (1 test/1s) nên bị điểm test Trong dạng tập dãy dạng tập dãy tăng liên tiếp dài tảng nhất, dễ hiểu (hay nói cách khác dạng tập dạng tập dạng dãy con) Có làm thành thạo tập dạng làm dạng tập khác dãy nâng cao hơn, trừu tượng Một tốn có nhiều thuật tốn để giải, việc phải đưa thuật toán tối ưu (bộ nhớ, thời gian, độ phức tạp ) để giải tốn Có nhiều phương pháp để giải toán dãy tăng liên tiếp dài truy vét, vét cạn, duyệt qua phần tử dãy mẹ, quy hoạch động Tơi xin mạnh dạn trình bày vấn đề đề tài: “GIẢI PHÁP DÙNG QUY HOẠCH ĐỘNG ĐỂ GIẢI MỘT SỐ DẠNG BÀI TẬP VỀ DÃY CON TĂNG LIÊN TIẾP” 1.2 Mục đích nghiên cứu Khi học sinh gặp dạng tập kiểm tra hay kỳ thi học sinh giỏi không bị điểm hay nói cách khác lấy điểm tối đa toán Để lấy điểm tối đa học sinh phải vận dụng linh hoạt thuật toán biết nên chọn thuật toán để giải toán 1.3 Đối tượng nghiên cứu Sáng kiến kinh nghiệm có đối tượng nghiên cứu toán dãy tăng liên tiếp dài 1.4 Phương pháp nghiên cứu Để trình bày sáng kiến kinh nghiện này, sử dụng phối kết hợp nhiều phương pháp như: nghiên cứu sở lý thuyết, nghiên cứu tài liệu, thuyết trình, phương pháp dạy học đổi mới… phù hợp với môn học thuộc lĩnh vực Tin học Nghiên cứu đưa cách trình bày viết chương trình hồn thiện số ví dụ từ đơn giản đến nâng cao dần NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 Cơ sở lý luận sáng kiến kinh nghiệm Căn vào mục tiêu môn Tin học: phải cung cấp tri thức bản, làm tảng để học sinh tiếp tục sâu vào tìm hiểu xây dựng khoa học Tin học tiếp thu tri thức lĩnh vực kĩ thuật công nghệ tiên tiến, lĩnh vực công nghệ thông tin Để xác định, đề nhiệm vụ cụ thể mơn, tổ chức hoạt động đào tạo góp phần thực mục tiêu giáo dục mà Đảng Nhà nước đề Nếu học sinh hiểu phần dạng tập dãy tăng liên tiếp, cách giải quyết, cách chọn phương pháp giải toán phụ thuộc vào liệu đề (dữ liệu nhỏ, liệu lớn) chắn học sinh đam mê hơn, u thích mơn học hơn, chất lượng học sinh nâng cao đặc biệt chất lượng đội tuyển ôn thi học sinh giỏi môn Tin học 2.2 Thực trạng vấn đề trước áp dụng sáng kiến kinh nghiệm Thực tế sau nhiều năm giảng dạy môn tin học 11, đặc biệt năm học gần nhà trường phân công giảng dạy, ôn thi đội tuyển học sinh giỏi cấp tỉnh, nhận thấy để đạt kết cao thi học sinh giỏi cấp tỉnh mơn văn hố, đặc biệt mơn tin học học sinh phải nỗ lực hết mình, tìm hiểu dạng tập phương pháp giải khác từ chọn phương pháp thuận tiện tối ưu Nhiều năm, kết thi học sinh giỏi cấp đạt chưa cao có nhiều nguyên nhân chủ yếu em không lấy điểm tối đa tốn em khơng làm dạng tập có làm kết sai làm chạy với test có liệu nhỏ, cịn test có liệu lớn khơng chạy (quá thời gian quy định 1test/1s) Trường THPT Hà Trung nằm địa bàn xã Hà Bình huyện Hà Trung xã nơng thơn huyện, có khoảng 80% học sinh trường em nhà làm nơng nghiệp nên chưa có đủ điều kiện kinh tế cho phép gia đình có máy vi tính phục vụ việc học tập em Trong năm học 2019 – 2020 trường Nguyễn Hoàng giải thể, phần sát nhập vào trường THPT Hà Trung nên trường có 42 lớp, gần nghìn tám học sinh Số lượng học sinh nhiều, chất lượng học sinh so với chưa sát nhập trường Trường có 03 phịng máy hoạt động, khơng thể đủ phịng thực hành cho tất lớp Mặc dù nhà trường có đội ngũ giáo viên trẻ nhiệt tình tâm huyết với nghề, mơn tin học mơn học đặc thù, có nhiều kiến thức khó đặc biệt lớp 11 nên có nhiều học sinh chưa hiểu nội dung chương trình học sách giáo khoa, dẫn đến tình trạng chán học, khơng thích học Thêm vào tư tưởng đa số học sinh – phụ huynh xem môn Tin học môn phụ, nên không mặn mà, không quan tâm tới mơn học Chính lí việc lựa chọn bồi dưỡng học sinh giỏi vơ khó khăn Khó khăn chồng chất khó khăn 2.3 Các giải pháp sử dụng để giải vấn đề đặt 2.3.1 Phần lý thuyết Khái niệm phương pháp 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 có th ể đưa phương án tối ưu số hữu hạn toán Đối với số toán đệ quy, nguyên lý chia để trị (divide and conquer) thường đóng vai trị chủ đạo việc thi ết kế tho ạt toán Đ ể giải tốn lớn, ta chia thành nhiều tốn d ạng với để giải độc lập Trong phương án quy hoạch động, nguyên lý chia để trị thể rõ: Khi phải giải toán nào, ta giải tồn tốn lưu trữ lời giải hay đáp số c chúng với mục đích sử dụng lại theo phối hợp đ ể gi ải quy ết 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 thành nhiều toán giải toán Việc gi ải tốn l ại đưa phép phân tiếp thành nhiều toán nh ỏ h ơn l ại gi ải tốn nhỏ giải hay ch ưa + Quy hoạch động việc giải tất toán nhỏ nh ất (bài toán sở) để từ bước giải tốn lớn hơn, giải toán lớn (bài tốn ban đầu) Ta xét ví dụ đơn giản sau: Ví dụ: Dãy Fibonacci dãy số nguyên dương định nghĩa nh sau: F1 = F2 =1 i, i ≥ 3: F1 = Fi-1 + Fi-2 Hãy tính F5 Xét cách lập chương trình sau: Cách Cách Program Fibo1; Program Fibo2; Function F(i: integer): integer; Var F: array[1 5] of integer; BEGIN I: integer; If i :=1 then F(1):=1; BEGIN If i:=2 then F(2) :=1 F[1]:=1; F[2]:=1; If i>=3 then F(i):= F(i-1) + F(iFor i:=3 to 2); F[i]:= F[i-1] + F[1-2]; End; Writeln(F[5]); BEGIN Readln; Writeln(F(5)); END Readln; END Trong cách ta viết hàm đệ quy F(i) để tính số Fibonaci th ứ i Chương trình gọi F(5) gọi tiếp F(4) F(3) để tính… Q trình tính tốn vẽ Ta nhận thấy để tính F(5) ph ải tính lần F(4), hai lần F(3), ba lần F(2), hai lần F(1) F(5) F(3) F(4) F(3) F(2) F(2) F(2) F(1) F(1) Hàm đệ quy tính số Fibonacci Theo cách khơng vậy, trước hết tính sẵn F(1) F(2), t tính tiếp F(3), lại tính tiếp F(4), F(5) Đảm bảo m ỗi giá tr ị Fibonacci phải tính lần Bài tốn giải theo phương pháp quy hoạch động gọi tốn quy hoạch động Cơng thức phối hợp nghiệm tốn đ ể có nghi ệm c tốn lớn gọi cơng thức truy hồi quy hoạch động Tập tốn có lời giải để từ giải tốn l ớn gọi sở quy hoạch động Khơng gian lưu trữ lời giải tốn để tìm cách ph ối h ợp chúng gọi bảng phương án quy hoạch động Trước áp đụng phương án quy hoạch động ta phải xem xét phương án có thoả mãn yêu cầu khơng: + Bài tốn lớn phải phân rã thành nhiều toán con, mà s ự 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 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 khơng thể thực + Q trình từ tốn sở tìm lời giải tốn ban đầu ph ải qua hữu hạn bước Các khái niệm: - Bài toán giải theo phương pháp quy hoạch động đ ược gọi toán quy hoạch động - Công thức phối hợp nghiệm tất tốn đ ể có nghiệm tốn lớn gọi cơng thức truy hồi (hay phương trình truy toán) quy hoạch động - Tập tốn nhỏ có lời giải đ ể t gi ải quy ết tốn lớn gọi sở quy hoạch động - Không gian lưu trữ lời giải toán để tìm cách ph ối h ợp chúng gọi bảng phương án quy hoạch động Các bước cài đặt số chương trình sử dụng quy hoạch động: - 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 - 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 toán l ớn h ơn lưu chúng vào bảng phương án Cho t ớ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 nghiệm tối ưu Cho tới nay, chưa có định lý cho biết cách xác tốn giải hiệu quy hoạch động Tuy nhiên để biết tốn giải quy hoạch động hay khơng, ta đặt câu hỏi: “Một nghiệm tối ưu toán lớn có phải s ự phối h ợp nhiệm tối ưu tốn hay khơng?” “Liệu lưu trữ nghiệm tốn d ưới m ột hình thức để phối hợp tìm nghiệm tốn lớn?” 3.2 Phần tập Đầu tiên học sinh bắt đầu làm quen với dạng toán dãy tăng liên tiếp dài muốn học sinh ph ải hiểu đ ược để gi ải tập dạng học sinh ph ải hi ểu đ ược nh th ế gọi dãy liên tiếp Ví dụ: Dãy A gồm số nguyên: 2, 1, 4, 7, Dãy liên tiếp A dãy sau: Dãy Số lượng phần tử dãy Từ thấy dãy tăng liên tiếp dài là: Số lượng1phần tử Dãy tăng liên tiếp dài 1dãy 1, 1,4,7,8 4, 24 Bài toán tổng 7, quát: 1, 4, Cho dãy A gồm 4, 7, N số 1, 4, 7, nguyên: a1, a2, a3,…, aN Hãy tìm dãy tăng liên tiếp thoả mãn: + Đưa số phần tử (độ dài) dãy tăng liên tiếp dài nh ất + Đưa số dãy tăng liên tiếp dài nh ất + Đưa phần tử dãy tăng liên tiếp dài + Đưa số phần tử dãy tăng liên ti ếp dài + ……………… Dữ liệu vào: File văn DAYCONTANGLIENTIEP.INP gồm: - Dòng đầu ghi giá trị N (N ≤ 10000) - Dòng sau gồm N số nguyên a 1, a2, a3,…, aN (|ai|≤ 106)mỗi số cách dấu cách Dữ liệu ra: File văn DAYCONTANGLIENTIEP.OUT gồm: - Dòng đầu ghi số lượng phần tử dãy - Dòng ghi phần tử dãy Cụ thể, dạng tập chia thành toán c b ản sau: Bài toán 1: DAYTANGLIENTIEP.INP DAYTANGLIENTIEP.OUT N - số lượng phần tử dãy a[1] a[2] a[3] a[N] Bài toán 2: DAYTANGLIENTIEP.INP DAYTANGLIENTIEP.OUT N - số lượng phần tử dãy a[1] a[2] a[3] a[N] - phần tử dãy Trường hợp kết toán có nhiều dãy liên tiếp có độ dài lại phân thành Bài tốn 2.1 Bài toán 2.2 Bài toán 2.1: DAYTANGLIENTIEP.INP DAYTANGLIENTIEP.OUT N - số lượng phần tử dãy a[1] a[2] a[3] a[N] Bài toán 2.2: DAYTANGLIENTIEP.INP N a[1] a[2] a[3] a[N] Bài toán 3: DAYTANGLIENTIEP.INP N a[1] a[2] a[3] a[N] - phần tử dãy DAYTANGLIENTIEP.OUT - số lượng phần tử dãy - phần tử dãy sau DAYTANGLIENTIEP.OUT - số lượng phần tử dãy - số dãy tăng liên tiếp dài - phần tử dãy Bài toán 4: DAYTANGLIENTIEP.INP N a[1] a[2] a[3] a[N] DAYTANGLIENTIEP.OUT - số lượng phần tử dãy - số dãy tăng liên tiếp dài - số phần tử dãy Phần thứ nhất: Sử dụng phương pháp khác (ch ưa s d ụng phương pháp quy hoạch động) để giải toán Bài toán 1: Số lượng phần tử dãy tăng liên tiếp dài DAYTANGLIENTIEP.INP DAYTANGLIENTIEP.OUT N - số lượng phần tử dãy a[1] a[2] a[3] a[N] Mô tả thuật toán: Khởi tạo: d = (Biến d lưu độ dài dãy xét ) max = (Biến max lưu độ dài dãy tăng liên tiếp dài nh ất) Cho i chạy từ đến n-1: Nếu a[i+1]> a[i] tăng biến d, ngược lại: Nếu d>max begin max = d, d =1end; Đưa giá trị max Code minh hoạ: Program daycontangdainhat; const fo= 'daycontangdainhat.inp'; fi= 'daycontangdainhat.out'; var a: array[1 10000] of longint; d,i,n, max:integer; BEGIN assign(input,fo); reset(input); assign(output,fi); Rewrite(output); Readln(n); For i:=1 to n read(a[i]); d:=1 ; max:=1; for i:=1 to n-1 if a[i+1] >a[i] then d:= d +1 else begin if max < d then max:= d; d:=1; end; write(max); close(input); close(output); END Bài toán 2: Bài toán 2.1: Đưa số lượng phần tử dãy tăng liên tiếp dài nh ất phần tử dãy (nếu có nhiều dãy có số l ượng ph ần t b ằng chương trình đưa dãy đầu tiên) DAYTANGLIENTIEP.INP DAYTANGLIENTIEP.OUT N - số lượng phần tử dãy a[1] a[2] a[3] a[N] - phần tử dãy Để đưa phần tử dãy tăng liên tục dài nh ất c ần có hai tham số: độ dài dãy số đầu c dãy (ho ặc ch ỉ s ố cuối dãy) Ở cho học sinh th nên đ ưa tham số số cuối (csc) hợp lí thuận tiện Bởi ta xét biến i tăng dần chạy từ phần tử đến phần tử cuối c dãy nên xét i đến đâu đưa số lượng phần tử dãy đ ưa kèm theo tham số số cuối (csc) Mơ tả thuật tốn: - Đưa số lượng phần tử thuật toán giống Bài toán - Đưa phần tử dãy đầu tiên: For i:= csc –max +1 to csc write (a[i]) Code minh hoạ: Program daycontangdainhat; const fo= 'daycontangdainhat.inp'; fi= 'daycontangdainhat.out'; var a: array[1 10000] of longint; d,i,n, max,csc:integer; BEGIN assign(input,fo); reset(input); assign(output,fi); Rewrite(output); Readln(n); 10 For i:=1 to n read(a[i]); d:=1 ; max:=1; for i:=1 to n-1 if a[i+1] >a[i] then d:= d +1 else begin if max < d then begin max:= d; csc:=i; end; d:=1; end; writeln(max); for i:=csc - max +1 to csc write(a[i],' '); close(input); close(output); END Bài toán 2.2: Đưa số lượng phần tử dãy tăng liên tiếp dài nh ất phần tử dãy (nếu có nhiều dãy có số l ượng ph ần t b ằng chương trình đưa dãy sau cùng) DAYTANGLIENTIEP.INP DAYTANGLIENTIEP.OUT N - số lượng phần tử dãy a[1] a[2] a[3] a[N] - phần tử dãy sau Thuật tốn: Hồn tồn giống thuật toán Bài toán 2.1 khác chỗ: ta thay điều kiện max < d max a[i] then d:= d +1 else begin if max a[i] tăng biến d ngược lại d:=1 Nếu d>mt begin mt=d, k:=1; cs[k]:=i+1 end, ngược lại: Nếu d=mt begin inc(k); cs[k]:=i+1 end, For j:=1 to k begin for i := cs[j] –mt +1 to cs[j] write (a[i]) (đ ưa phần tử dãy tăng liên tiếp dài tho ả mãn điều ki ện) Code minh hoạ: Program daycontangdainhat; const fo= 'daycontangdainhat.inp'; fi= 'daycontangdainhat.out'; var a, cs : array[1 10000] of longint; d,i,j,n,k,mt:integer; BEGIN assign(input,fo); reset(input); assign(output,fi); Rewrite(output); Readln(n); For i:=1 to n read(a[i]); d:=1 ; k:=1; mt:=1; for i:=1 to n-1 begin 12 if a[i+1] >a[i] then d:= d +1 else d:=1; if d > mt then begin mt:= d; k:=1; cs[k]:=i+1; end else if d = mt then begin inc(k); cs[k]:=i+1; end; end; writeln (mt,' ',k); for j:=1 to k begin for i:=cs[j] - mt +1 to cs[j] write(a[i],' '); writeln; end; close(input); close(output); END Bài toán 4: Đưa số lượng phần tử dãy số dãy tăng liên tiếp dài nh ất số tử dãy DAYTANGLIENTIEP.INP DAYTANGLIENTIEP.OUT N - số lượng phần tử dãy a[1] a[2] a[3] a[N] - số dãy tăng liên tiếp dài - số phần tử dãy Thuật toán: Giống thuật toán Bài toán khác phần đưa số phần tử dãy: thay write (a[i]) write (i) For j:=1 to k begin for i := cs[j] –mt +1 to cs[j] write (i) Code minh hoạ: Program daycontangdainhat; const fo= 'daycontangdainhat.inp'; fi= 'daycontangdainhat.out'; var a, cs : array[1 10000] of longint; d,i,j,n,k,mt:integer; BEGIN assign(input,fo); reset(input); assign(output,fi); Rewrite(output); Readln(n); For i:=1 to n read(a[i]); d:=1 ; k:=1; mt:=1; for i:=1 to n-1 begin 13 if a[i+1] >a[i] then d:= d +1 else d:=1; if d > mt then begin mt:= d ; k:=1; cs[k]:=i+1; end else if d = mt then begin inc(k); cs[k]:=i+1; end; end; writeln (mt,' ',k); for j:=1 to k begin for i:=cs[j] - mt +1 to cs[j] write(i,' '); writeln; end; close(input); close(output); END Phần thứ 2: Sử dụng phương pháp quy hoạch động để giải tập dạng dãy tăng liên tiếp Như tơi nói từ ban đầu để giải tốn có nhiều cách giải, cách giải ta phải ch ọn đ ược cách giải tối ưu cho toán Và đương nhiên đối v ới d ạng tốn tìm dãy tăng liên tiếp dài thoả mãn số điều kiện có nhiều thuật toán để giải khác Và từ vấn đề đặt liệu tốn chưa lớn (n=10 8) thuật tốn khơng triệt để chạy test với liệu nhỏ cịn test mà có liệu lớn hồn tồn bị điểm khơng đủ th ời gian chạy 1test/1s chạy kết chưa Chính tơi muốn cho học sinh thấy dạng tập không ph ải thích dùng cách dùng mà cịn phụ thuộc vào nhiều yếu tố (th ời gian, độ l ớn liệu, độ phức tạp tốn…) Có cách khắc phục h ầu hết nhược điểm dùng phương pháp quy hoạch đ ộng Tôi hướng dẫn học sinh giải toán dãy tăng liên tiếp phương pháp quy hoạch động dựa tảng giải quy ết đ ược tập phương pháp khác mà đưa ph ần th ứ (có liệu dầu vào nhỏ: na[i] then f[i+1]:= f[i] +1 else f[i+1]:=1; if max < f[i+1] then max:= f[i+1] ; write(max); close(input); 15 END close(output); Bài toán 2: Bài toán 2.1: Đưa số lượng phần tử dãy tăng liên tiếp dài nh ất phần tử dãy (nếu có nhiều dãy có số l ượng ph ần t b ằng chương trình đưa dãy đầu tiên) DAYTANGLIENTIEP.INP DAYTANGLIENTIEP.OUT N - số lượng phần tử dãy a[1] a[2] a[3] a[N] - phần tử dãy Để đưa phần tử dãy tăng liên tục dài nh ất c ần có hai tham số: độ dài dãy số đầu dãy (hoặc s ố cu ối c dãy) Ở xét biến i chạy từ phần tử đ ến ph ần t cuối dãy nên ta sử dụng biến số cuối Mơ hình thuật toán: - Gọi F[i] độ dài dãy tăng liên tiếp dài nh ất có s ố cu ối i - Bài toán sở: F[1] = 1(bởi dãy có nh ất m ột ph ần t nên có độ dài dãy 1) - Công thứ quy hoạch động: Nếu a[i+1]> a[i] f[i+1] = f[i] +1 ngược lại f[i+1] = - Kết toán: Max(f[i+1]) với i = 1, 2, …, n-1 ph ần t a[i] dãy tìm Code minh hoạ: Program daycontangdainhat; const fo= 'daycontangdainhat.inp'; fi= 'daycontangdainhat.out'; var f,a : array[1 10000] of longint; i,n,max, csc:integer; BEGIN assign(input,fo); reset(input); assign(output,fi); Rewrite(output); Readln(n); For i:=1 to n read(a[i]); f[1]:=1; max:=1; for i:=1 to n-1 begin if a[i+1] > a[i] then f[i+1]:=f[i] +1 else f[i+1]:=1; if f[i+1] > max then begin max:= f[i+1] ; csc:=i+1; end; end; writeln(max); 16 for i:= csc - max +1 to csc write(a[i],' '); close(input); close(output); END Bài toán 2.2: Đưa số lượng phần tử dãy tăng liên tiếp dài nh ất phần tử dãy (nếu có nhiều dãy có số l ượng ph ần t b ằng chương trình đưa dãy sau cùng) DAYTANGLIENTIEP.INP DAYTANGLIENTIEP.OUT N - số lượng phần tử dãy a[1] a[2] a[3] a[N] - phần tử dãy sau Mơ hình thuật tốn: Giống thuật tốn tốn 2.1 khác thay điều kiện f[i+1]> max điều kiện f[i+1]>= max Code minh hoạ: Program daycontangdainhat; const fo= 'daycontangdainhat.inp'; fi= 'daycontangdainhat.out'; var f,a : array[1 10000] of longint; i,n,max, csc:integer; BEGIN assign(input,fo); reset(input); assign(output,fi); Rewrite(output); Readln(n); For i:=1 to n read(a[i]); f[1]:=1; max:=1; for i:=1 to n-1 begin if a[i+1] >a[i] then f[i+1]:=f[i] +1 else f[i+1]:=1; if f[i+1] >= max then begin max:= f[i+1] ; csc:=i+1; end; end; writeln(max); for i:=csc - max +1 to csc write(a[i],' '); close(input); close(output); END Bài toán Đưa số lượng phần tử dãy số dãy tăng liên tiếp dài nh ất tử dãy 17 DAYTANGLIENTIEP.INP N a[1] a[2] a[3] a[N] DAYTANGLIENTIEP.OUT - số lượng phần tử dãy con, số dãy tăng liên tiếp dài - phần tử dãy Thuật toán: - Gọi F[i] độ dài dãy tăng liên tiếp dài nh ất có s ố cu ối i - Bài toán sở: F[1] = - Cơng thứ quy hoạch động: Nếu a[i+1]> a[i] f[i+1] = f[i] +1 ngược lại f[i+1] = - Kết toán: Max(f[i+1]) với i = 1, 2, …, n-1 ph ần t a[i] dãy tìm Code minh hoạ: Program daycontangdainhat; const fo= 'daycontangdainhat.inp'; fi= 'daycontangdainhat.out'; var f,a, cs : array[1 10000] of longint; i,j,n,k,max:integer; BEGIN assign(input,fo); reset(input); assign(output,fi); Rewrite(output); Readln(n); For i:=1 to n read(a[i]); f[1]:=1; max:=1; for i:=1 to n-1 begin if a[i+1] >a[i] then f[i+1]:=f[i] +1 else f[i+1]:=1; if f[i+1] > max then begin max:= f[i+1] ; k:=1; cs[k]:=i+1; end else if f[i+1] = max then begin inc(k); cs[k]:=i+1; end; end; writeln(max,' ',k); for j:=1 to k begin for i:=cs[j] - max +1 to cs[j] write(a[i],' '); writeln; end; 18 close(input); close(output); END Bài toán Đưa số lượng phần tử dãy số dãy tăng liên tiếp dài nh ất số tử dãy DAYTANGLIENTIEP.INP DAYTANGLIENTIEP.OUT N - số lượng phần tử dãy con, số dãy a[1] a[2] a[3] a[N] tăng liên tiếp dài - số phần tử dãy Thuật toán: - Gọi F[i] độ dài dãy tăng liên tiếp dài nh ất có s ố cu ối i - Bài tốn sở: F[1] = - Cơng thứ quy hoạch động: Nếu a[i+1]> a[i] f[i+1] = f[i] +1 ngược lại f[i+1] = - Kết toán: Max(f[i+1]) với i = 1, 2, …, n-1 ch ỉ s ố i c phần tử dãy tìm Code minh hoạ: Program daycontangdainhat; const fo= 'daycontangdainhat.inp'; fi= 'daycontangdainhat.out'; var f,a, cs : array[1 10000] of longint; i,j,n,k,max:integer; BEGIN assign(input,fo); reset(input); assign(output,fi); Rewrite(output); Readln(n); For i:=1 to n read(a[i]); f[1]:=1; max:=1; for i:=1 to n-1 begin if a[i+1] >a[i] then f[i+1]:=f[i] +1 else f[i+1]:=1; if f[i+1] > max then begin max:= f[i+1] ; k:=1; cs[k]:=i+1; end else if f[i+1] = max then begin inc(k); cs[k]:=i+1; end; 19 end; writeln(max,' ',k); for j:=1 to k begin for i:=cs[j] - max +1 to cs[j] write(i,' '); writeln; end; close(input); close(output); END Phần thứ 3: Các dạng tập liên quan, nâng cao Bài tập 1: Cho dãy A gồm N số nguyên: a 1, a2, a3,…, aN Hãy tìm dãy tăng liên tiếp dài tạo thành cấp số cộng có công sai d + Đưa số phần tử (độ dài) dãy tăng liên tiếp dài nh ất + Đưa số số dãy tăng liên tiếp dài + Đưa phần tử dãy tăng liên tiếp dài + Đưa số phần tử dãy tăng liên ti ếp dài Hướng dẫn: Thuật toán tương tự toán thay điều kiện: a[i+1]> a[i] điều kiện: a[i+1] – a[i] = d Bài tập 2: Cho dãy A gồm N số nguyên: a 1, a2, a3,…, aN Hãy tìm dãy tăng liên tiếp dài có số phần tử dương (phần tử âm) nhiều nh ất + Đưa số phần tử (độ dài) dãy tăng liên tiếp dài nh ất + Đưa số số dãy tăng liên tiếp dài + Đưa phần tử dãy tăng liên tiếp dài + Đưa số phần tử dãy tăng liên ti ếp dài Hướng dẫn: Thuật toán tương tự toán thay điều kiện: a[i+1]> a[i] điều kiện: a[i] >0 (hoặc a[i]

Ngày đăng: 14/07/2020, 12:20

Từ khóa liên quan

Mục lục

  • 1. 1. Lý do chọn đề tài.

    • 3.2. Phần bài tập

    • 3.2. Kiến nghị.

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

  • Đang cập nhật ...

Tài liệu liên quan