(SKKN mới NHẤT) 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

23 10 0
(SKKN mới NHẤT) 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 TIEU LUAN MOI download : skknchat@gmail.com THANH HOÁ, 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 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.2 Thực trạng vấn đề trước áp dụng sáng kiến kinh nghiệm.2 2.3 Các giải pháp sử dụng để giải vấn đề đặt .3 2.3.1 Phần lý thuyết .3 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 TIEU LUAN MOI download : skknchat@gmail.com 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 hoá hàng năm tỉnh Thanh Hoá tiêu chí lớn để xét thành tích trường năm học đó.Trường THPT Hà Trung ln 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 toá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 tố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 TIEU LUAN MOI download : skknchat@gmail.com 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, tơi 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 (q 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, đủ TIEU LUAN MOI download : skknchat@gmail.com 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 đư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ế tố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 tốn nào, ta giải tồn 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 thành nhiều tốn giải tốn Việc giải toán lại đưa phép phân tiếp thành nhiều toán nhỏ 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ỏ (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 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; TIEU LUAN MOI download : skknchat@gmail.com 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(i-2); For i:=3 to End; F[i]:= F[i-1] + F[1-2]; BEGIN Writeln(F[5]); Writeln(F(5)); Readln; Readln; END 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 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 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 u cầu khơng: + Bài tốn lớn phải phân rã thành nhiều toán con, mà phối hợp lời giải toán cho ta lời giải tốn lớn TIEU LUAN MOI download : skknchat@gmail.com + Vì quy hoạch động giải tất toá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 gọi tố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 tốn) quy hoạch động - Tập tốn nhỏ 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 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 tốn lớn lưu chúng vào bảng phương án Cho tới tốn ban đầu tìm 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 phối hợp nhiệm tối ưu tốn hay khơng?” “Liệu lưu trữ nghiệm toán hình thức để phối hợp tìm nghiệm toá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 tốn dãy tăng liên tiếp dài tơi muốn học sinh phải hiểu để giải tập dạng học sinh phải hiểu 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: TIEU LUAN MOI download : skknchat@gmail.com Từ dãy dài Dãy Số lượng phần tử dãy 1 1 2 3 thấy tăng liên tiếp là: 1, 4, 7, 1, 4, 4, 7, 1, 4, 7, Dãy tăng liên tiếp dài Số lượng phần tử dãy 1,4,7,8 Bài toán tổng quát: Cho dãy A gồm N số 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 + Đưa 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 + ……………… 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 a1, 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 tơi chia thành tố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 tố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 TIEU LUAN MOI download : skknchat@gmail.com Bài toán 2.1: DAYTANGLIENTIEP.INP N 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] DAYTANGLIENTIEP.OUT - số lượng phần tử dãy - 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 tố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; TIEU LUAN MOI download : skknchat@gmail.com 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 phần tử dãy (nếu có nhiều dãy có số lượng phần tử 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 cần có hai tham số: độ dài dãy số đầu dãy (hoặc số cuối dãy) Ở cho học sinh thấy 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 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 10 TIEU LUAN MOI download : skknchat@gmail.com 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 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 phần tử dãy (nếu có nhiều dãy có số lượng phần tử 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 tốn Bài tố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]); 12 TIEU LUAN MOI download : skknchat@gmail.com d:=1 ; k:=1; mt:=1; for i:=1 to n-1 begin 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 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]); 13 TIEU LUAN MOI download : skknchat@gmail.com END d:=1 ; k:=1; mt:=1; for i:=1 to n-1 begin 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); 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ách giải tối ưu cho toán Và đương nhiên 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 tốn để giải khác Và từ vấn đề đặt liệu toán chưa lớn (n=108) 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à phụ thuộc vào nhiều yếu tố (thời gian, độ lớn liệu, độ phức tạp toá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 14 TIEU LUAN MOI download : skknchat@gmail.com 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; 15 TIEU LUAN MOI download : skknchat@gmail.com if max < f[i+1] then write(max); close(input); close(output); max:= f[i+1] ; 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 phần tử dãy (nếu có nhiều dãy có số lượng phần tử 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 cần có hai tham số: độ dài dãy số đầu dãy (hoặc số cuối 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 có số cuối i - Bài tốn sở: F[1] = 1(bởi dãy có 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; 16 TIEU LUAN MOI download : skknchat@gmail.com end; 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 phần tử dãy (nếu có nhiều dãy có số lượng phần tử 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 17 TIEU LUAN MOI download : skknchat@gmail.com Đưa số lượng phần tử dãy số dãy tăng liên tiếp dài 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 - 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 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],' '); 18 TIEU LUAN MOI download : skknchat@gmail.com writeln; end; 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 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 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 số i 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); 19 TIEU LUAN MOI download : skknchat@gmail.com end; cs[k]:=i+1; 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: a1, 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 + Đư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: a1, 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 + Đưa số phần tử (độ dài) dãy tăng liên tiếp dài + Đư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: 10/07/2022, 06:56

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

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

Tài liệu liên quan