Tai Lieu

10 6 0
Tai Lieu

Đang tải... (xem toàn văn)

Thông tin tài liệu

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[r]

MỘT SỐ BÀI TOÁN QHD TIÊU BIỂU 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 tìm 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ế thuật toán Ðể giải toá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 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ỏ 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 toán ban đầu) 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 toán để có nghiệm tốn lớn gọi cơng thức truy hồi quy hoạch động Tập toán có lời giải để từ giải toá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 dụng phương pháp quy hoạch động ta phải xét xem phương pháp có thỏa 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à 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 toá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 - Q 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ác bước cài đặt chương trình sử dụng quy hoạch động: - Giải tất toá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 lưu chúng vào bảng phương án Cho tới toá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 tốn lớn có phải phối hợp nghiệ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 ngiệm toán lớn?” Các bước để giải toán quy hoạch động: Với toán ứng dụng giải thuật quy hoạch động, ta phải trả lời rõ ràng, xác câu hỏi: Tên ý nghĩa biến phục vụ sơ đồ lặp, Cách khai báo biến đó, Sơ đồ (cơng thức) lặp chuyển từ bước sang bước tiếp theo, Giá trị đầu biến tham gia tính lặp, Tham số điều khiển lặp: thay đổi từ đâu đến đâu, Kết quả: đâu làm để dẫn xuất Các cách trả lời khác dẫn đến giải thuật khác cách thực lẫn độ phức tạp Ví dụ tốn giải phương pháp quy hoạch động 3.1 Bài tốn Tính N! GT.PAS 1 n 0  Ta có định nghĩa sau: n! = n * (n  1)! n  Cho số nguyên dương n (0  n  13) Yêu cầu: Hãy tính n! phương pháp quy hoạch động (lập bảng phương án) Dữ liệu vào: Ghi file văn GT.INP có cấu trúc sau: - Dịng 1: Ghi số nguyên dương n Dữ liệu ra: Ghi file văn GT.OUT theo cấu trúc sau: - Dịng 1: Ghi giá trị tính n! Ví dụ: GT.INP GT.OUT Thuật tốn: Gọi GT[i] giá trị i! (0  i  13) Ta có cơng thức quy hoạch động sau: GT[i] := GT[i-1]*i; Như vậy, việc tính n! thực vòng lặp: GT[0] :=1; For i:=1 to n GT[i] := GT[i-1]*i; Kết quả: giá trị n! nằm phần tử GT[n] 3.2 Bài tốn Tính dãy Fibonaci FIBO.PAS 1  Ta có định nghĩa sau: F(n) =  F (n  1)  F (n  2) n 0 or n 1 n  Cho số nguyên dương n (0  n  50) Yêu cầu: Hãy tính F(n) phương pháp quy hoạch động (lập bảng phương án) Dữ liệu vào: Ghi file văn FIBO.INP có cấu trúc sau: - Dòng 1: Ghi số nguyên dương n Dữ liệu ra: Ghi file văn FIBO.OUT theo cấu trúc sau: - Dịng 1: Ghi giá trị tính F(n) Ví dụ: FIBO.INP FIBO.OUT Thuật toán: Gọi F[i] giá trị Fibonaci fi (0  i  50) Ta có cơng thức quy hoạch động sau: F[i] := F[i-1] + F[i-2]; Như vậy, việc tính fn thực vịng lặp: F[0] := 0; F[1] := 1; For i := to n F[i] := F[i-1] + F[i-2]; Kết quả: giá trị fn nằm F[n] 3.3 Bài tốn Tính tổng dãy số SUM.PAS Cho dãy số nguyên gồm n phần tử a1, a2, …, an (1  n  105) hai số nguyên dương p q (1  p  q  n) Yêu cầu: Hãy tính tổng phần tử liên tiếp từ ap … aq phương pháp quy hoạch động (lập bảng phương án) Dữ liệu vào: Ghi file văn SUM.INP có cấu trúc sau: - Dịng 1: Ghi số nguyên dương n k, hai số ghi cách dấu cách - Dòng 2: Ghi n số nguyên a1, a2, …, an, số ghi cách dấu cách (-32000   32000) - Dòng thứ i k dòng tiếp theo: Mỗi dòng ghi hai số nguyên dương pi qi, hai số ghi cách dấu cách (1  pi  qi  n) Dữ liệu ra: Ghi file văn SUM.OUT theo cấu trúc sau: - Dữ liệu ghi k dòng: Dòng thứ i ghi số nguyên tổng giá trị phần tử đoạn a p aq Ví dụ: SUM.INP -3 4 i i SUM.OUT 21 Thuật toán: Gọi A[i] giá trị phần tử thứ i dãy số a1, a2, …, an Gọi T[i] tổng giá trị phần tử a1, a2, …, (1  i  n) Ta có cơng thức quy hoạch động để tính T[i] sau: T[i] := T[i - 1] + A[i]; Như vậy, việc tính T[n] thực vòng lặp: T[0] := 0; For i:=1 to n T[i] := T[i - 1] + A[i]; Kết quả: Tổng phần tử liên tiếp từ ap đến aq tính theo cơng thức: Sum := A[q] - A[p-1]; 3.4 TRIANGLE PASCAL (Tam giác Pascal) TRIANPAS.PAS Tam giác Pascal mơ hình dùng để đưa hệ số khai triển nhị thức Newton bậc N (x+1)N 2 Ví dụ: khai triển (x+1) = x + 2x +1 3 1 có hệ số 1 1 0 Trong khai triển (x+1)3 = x3 + 3x2 + 3x + có hệ số 3 Yêu cầu: Hãy tìm hệ số khai triển nhị thức Newton (x + 1)N Dữ liệu vào: Cho file văn TRIANPAS.INP có cấu trúc sau: Dòng 1: Ghi số nguyên dương N (1 ≤ N ≤ 100) Dữ liệu ra: Ghi file văn TRIANNUM.OUT theo cấu trúc: Dòng 1: Ghi số nguyên dương hệ số khai triển nhị thức Newton (x + 1)N, số ghi cách dấu cách Ví dụ: TRIANPAS.INP TRIANPAS.OUT 5 10 10 Thuật toán: + Ta xây dựng mảng hai chiều có kích thước [0 100, 101] + Sử dụng phương pháp quy hoạch động với cơng thức sau: Dịng thứ i tính thơng qua dịng i-1 L[i, j] = L[i-1, j-1] + L[i-1, j] + Thuật toán cụ thể sau: L[0,1] = 1; L[1,1] = 1; L[1,2] = 1; For i:= to N Begin L[i, 1] :=1; For j:=2 to i+1 L[i, j] = L[i-1, j-1] + L[i-1, j]; End; + Kết lưu trữ dòng N, cụ thể: L[N, 1], L[N, 2], L[N, 3], , L[N, N], L[N,N+1] 3.5 TRIANGLE NUMBER (Tam giác số) TRIANNUM.PAS Cho tam giác số hình vẽ Ta định nghĩa đường 7đi tam giác số đường xuất phát từ hình thoi đỉnh tam giác đến2được8 hình thoi có tam giác chung cạnh với nó, đường kết thúc gặp hình thoi5 đáy Yêu cầu: Hãy tìm đường tam giác số sao4 cho6tổng9giá trị 6 đường có giá trị lớn Dữ liệu vào: Cho file văn TRIANNUM.INP có cấu trúc sau: Dịng 1: Ghi số nguyên dương N số hàng tam giác (1 ≤ N ≤ 100) Dòng thư i N dòng tiếp theo: Ghi i số nguyên dương giá trị dịng thứ i tưng ứng tam giác (Các số có giá trị không 32000) Các số ghi cách dấu cách Dữ liệu ra: Ghi file văn TRIANNUM.OUT theo cấu trúc: Dòng 1: Ghi số nguyên dương S tổng giá trị đường tìm Ví dụ: TRIANNUM.INP 7 TRIANNUM.OUT 48 6 Thuật toán: + Ta xây dựng mảng hai chiều có kích thước [1 100, 101] + Sử dụng phương pháp quy hoạch động với cơng thức sau: Dịng thứ i tính thơng qua dịng i-1 L[i, j] = Max(L[i-1, j-1] + L[i-1, j]) + A[i, j] + Thuật toán cụ thể sau: L[1, 1] = A[1, 1]; For i:= to N Begin For j:=1 to i L[i, j] = Max(L[i-1, j-1] + L[i-1, j]) + A[i, j]; End; + Kết lưu trữ dòng N, cụ thể: Tong: = L[N, 1] For j:= to N if (L[N, j] > Tong) then Tong := L[N, j]; Các tập nâng cao áp dụng phương pháp quy hoạch động để giải 4.1 Bài toán Cử tạ DUMBBELL.??? Rèn luyện thể lực cách tập nâng tạ thu hút ý nhiều bạn trẻ Tạ trục có gắn hai đầu đĩa tạ Bộ đĩa tạ phòng tập bao gồm loại 1kg, 2kg, 5kg, 10kg, 15kg 20kg với số lượng loại đủ nhiều Các đĩa tạ hai đầu gắn đối xứng để đảm bảo tạ cân Mỗi người, tùy theo thể lực mình, lắp đĩa tạ để có trọng lượng phù hợp Để điều chỉnh trọng lượng, người ta tháo đĩa cùng, lắp đĩa vào Do tính đối xứng tạ, ta xét thao tác điều chỉnh đầu Hiện đầu có n đĩa tạ gắn vào trục (1 ≤ n ≤ 10), tính từ ngồi đĩa thứ i có trọng lượng pi Bạn cần có tạ với trọng lượng đầu w (0 ≤ w ≤ 100) Ví dụ, n = đĩa tạ (2, 2, 1, 20), bạn cần điều trọng lượng thành 14kg Bạn phải thực thao tác tháo lắp: tháo đĩa 20kg, tháo đĩa 1kg lắp đĩa 10kg Yêu cầu: Cho n, pi, i = ÷ n, w Hãy xác định số thao tác cần thực Dữ liệu vào: Cho file văn DUMBBELL.INP có cấu trúc sau - Dòng 1: Ghi số nguyên n - Dòng 2: Ghi n số nguyên p1, p2, , pn, số ghi cách dấu cách - Dòng 3: Ghi số nguyên w Dữ liệu ra: Ghi file văn DUMBBELL.OUT theo cấu trúc sau: - Dòng 1: Ghi số thao tác cần thực Ví dụ: DUMBBELL.INP DUMBBELL.OUT 2 20 14 Thuật toán: Ta tạo bảng phương án B, Bi xác định số lần lắp đĩa tối thiểu để làm tăng trọng lượng lên i kg Var b:array[0 100] of byte; Việc xác định Bi (i = ÷ 100) đơn giản: t := i div 20; j := i mod 20; t := t + j div 15; j := j mod 15; t := t+j div 10; j := j mod 10; t:= t+j div 5; j := j mod 5; t:= t+j div 2; j := j mod 2; B[i]:= t+j ; Nếu sử dụng mảng C với Ci số lần lắp đĩa tối thiểu để làm tăng trọng lượng lên i kg (i = ÷ 19) C :array[0 19] of byte; = (0, 1, 1, 2, 2, 1, 2, 2, 3, 3, 1, 2, 2, 3, 3, 1, 2, 2, 3, 3); Việc tính Bi (i:= ÷ 100) lúc cần sử dụng vòng lặp: For i:=0 to 19 B[i]:=C[i]; For i:= 20 to 100 B[i]:= i div 20 + B[i mod 20]; Lời giải tốn nhận cách duyệt tất cách tháo đĩa tạ n, n-1, n-2, , 2, Bảng phương án cịn cơng cụ sắc bén với loại toán liên quan tới phát hiện, nhận dạng chu trình Nó giúp ta đạt hiệu O(n) nhiều trường hợp – O(1)! 4.2 Bài toán Thỏ nhặt cà rốt CARROT.??? Các thú nuôi chuồng vườn bách thú thường có điều kiện vận động Điều vừa có hại cho sức khỏe thú nuôi, vừa làm làm giảm hứng thú khách tham quan Để khắc phục điều đó, Ban giám đốc cho đặt thang có n bậc chuồng thỏ Đến cho ăn người ta đặt cà rốt - thứ khoái thỏ, lên bậc thang Thỏ phải nhảy theo bậc thang để lấy cà rốt Mỗi bước nhảy thỏ vượt k bậc (1 ≤ k ≤ n ≤ 300) Có thể có nhiều cách nhảy để lấy cà rốt Hai cách nhảy gọi khác tồn bậc thỏ tới cách nhảy bị bỏ qua cách Ví dụ, với n = k = có tất cách lấy cà rốt khác nhau: 1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2, 1+3, 3+1 Yêu cầu: Cho k n Hãy xác định số cách khác thỏ thực để lấy cà rốt Dữ liệu vào: Ghi file văn CARROT.INP có cấu trúc sau: - Dòng 1: Ghi số nguyên dương t số lượng cặp k n (1 ≤ t ≤ 50) - Dòng thứ i t dòng tiếp theo: Mỗi dòng ghi số nguyên k n Dữ liệu ra:: Ghi file văn CARROT.OUT, kết test đưa dòng dạng số nguyên Ví dụ: CARROT.INP CARROT.OUT 13 21 27 274 10 Thuật toán: Đây toán áp dụng sơ đồ tính lặp để tích lũy kết Loại sơ đồ có chất gần với giải thuật quy hoạch động nên nhiều người ta gộp vào tốn có thuật giải quy hoạch động Ta có thuật tốn sau: a) Gọi fi số cách mà thỏ nhảy tới bậc thứ i thang, i −1 b) Công thức lặp (cách tính fi): fi = ∑ j=i − k fj For i:=1 to n For j:= i - k to i – F[i] := F[i] + F[j]; c) Giá trị đầu: Cần có k giá trị ban đầu để triển khai cơng thức lặp Có thể chọn hai cách: i −1 Tính riêng fi (i = ÷ k) theo cơng thức f0=1, fi = ∑fj j=1 F[0] := 1; For i:=1 to k For j:=1 to i-1 F[i] := F[i] + F[j]; Lúc ta có thủ tục tính sau: Procedure Process; Var i, j:Longint; Begin F[0] := 1; For i:=1 to k For j:=1 to i-1 F[i] := F[i] + F[j]; For i:=k+1 to n For j:= i - k to i – F[i] := F[i] + F[j]; End; Cho f0 = 1, fi = 0, i = -k+1 ÷ -1, d) Khai báo: Nếu áp dụng cách chuẩn bị giá trị đầu thứ cần khai báo: Var f:array[-300 300] of int64; Procedure Process; Var i, j:Longint; Begin F[0] := 1; For i:=-k+1 to -1 F[i] := 0; For i:= to n For j:= i - k to i – F[i] := F[i] + F[j]; End; e) Nếu sử dụng cách chuẩn bị giá trị đầu thứ phải tính với i = ÷ n, f) Kết quả: giá trị fn Lưu ý: - Bài tốn áp dụng giải thuật tìm kiếm quay lui (Back Tracking) - Kiểu liệu chưa thật quan trọng, xác định xác q trình hiệu chỉnh chương trình, thử nghiệm với k = n =300

Ngày đăng: 22/11/2021, 08:46

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

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

Tài liệu liên quan