Tải bản đầy đủ (.ppt) (30 trang)

Tài liệu bồi dưỡng học sinh giỏi Tin học nâng cao Quy hoạch động

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (502.34 KB, 30 trang )

09/14/14
1
QUY HOẠCH ĐỘNG
(Dynamic programming)
09/14/14
2

Bài toán số Fibonacci

Kỹ thuật quy hoạch động

Các bài toán áp dụng QHĐ trên
mảng một chiều và mảng hai chiều

Thảo luận, trao đổi kinh nghiệm,
đánh giá và nhận xét phương pháp
NỘI DUNG
09/14/14
3
Bài toán về dãy số Fibonacci (1)
1
1
2
3
5
Rabbits
09/14/14
4
Bài toán về dãy số Fibonacci (2)
The Fibonacci Numbers
1,1,2,3,5,8,13,21,34,55,89,144,…


F
1
= F
2
= 1
F
n
= F
n-1
+ F
n-2
n≥3
Vấn đề. Bạn hãy tính số hạng thứ N của dãy Fibonacci?
09/14/14
5
Bài toán về dãy số Fibonacci (3)
GT đệ qui tính số Fibo thứ N

Function f(n:integer):longint;

begin

if (n =0) or (n=1) then f:=1

else

f:= f(n – 2) + f(n – 1);

End;
09/14/14

6
Bài toán về dãy số Fibonacci (4)
Fibonacci numbers
f(1) = f(2) = 1
f(n) = f(n - 1) + f(n - 2)
Giải bằng chia để trị và đệ quy:
function f(i: Integer): Integer;
begin
if i <= 2 then
Result := 1
else
Result := f(i - 1) + f(i - 2);
end;
f(1) f(2)
f(3) f(2)
f(4)
f(1) f(2)
f(3)
f(5)
f(1) f(2)
f(3) f(2)
f(4)
f(6)
Số phép cộng
f(100) = 354.224.848.179.261.915.075
Số phép cộng
f(100) = 354.224.848.179.261.915.075
So… is this good?
Is it bad?
overlappingoverlapping

09/14/14
7
Bài toán về dãy số Fibonacci(5)
Một hướng tiếp cận khác
Chúng ta sẽ sử dụng một mảng một chiều F
f[0 max_n]
F[i] lưu số Fibo thứ i
i 1 2 3 4 5 …
F[i] 1 1 2 3 5 …
09/14/14
8
Bài toán về dãy số Fibonacci (6)
const MAX_N 10000
Var f:array[1 max_n] of integer;
I:integer;
Begin
readln(N)
f[1] := 1;
f[2] := 1;
for i := 3 to n do
f[i] = f[i – 2] + f[i – 1];
write(f[n]);
End;
The trick: overlapping subproblems
09/14/14
9
Kỹ thuật QHĐ (1)
Định nghĩa:
QHĐ là một kỹ thuật thiết kế giải
thuật để giải quyết bài toán tối ưu

thường là nhỏ nhất hay lớn nhất.
QHĐ kết hợp chia để trị với kỹ
thuật tổ chức lưu trữ bộ nhớ.
09/14/14
10
Kỹ thuật QHĐ (2)
4 bước giải quyết bằng QHĐ

Tìm nghiệm của bài toán con nhỏ nhất.

Tìm ra công thức xây dựng nghiệm của bài toán
con thông qua các bài toán con nhỏ hơn.

Tạo ra một bảng lưu giữ các nghiệm của bài
toán con theo công thức đã tìm ra và lưu vào
bảng.

Từ các bài toán con đã giải để tìm nghiệm của
bài toán.
Chúng ta sẽ nghiên cứu KT này bằng các ví dụ
cụ thể sau đây.
09/14/14
11
Một số bài toán áp dụng QHĐ
Tam giác Pascal
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

(N=4)
09/14/14
12
Công thức QHĐ
A[i,j] = a[i-1,j-1] + a[i-1,j]
A[i,1]=1 (với mọi i=1 N)
A[i,i]=1 (với mọi i=1 N)
09/14/14
13
Dãy con đơn điệu không giảm dài nhất

Bài toán: Cho dãy gồm N phần tử
nguyên. Hãy xóa đi một số ít nhất các
phần tử để các phần tử còn lại lập
thành dãy không giảm dài nhất

VD: 5 2 3 4 9 10 5 6 7 8

 2 3 4 5 6 7 8
09/14/14
14
Một hướng giải quyết

Xây dựng mảng một chiều L, với L[i] là
độ dài của dãy kết quả khi bài toán chỉ
xét dãy A1, A2,…, Ai và công thức truy
hồi của nó như sau:

L[i]= max{L[i],L[j]+1 ∀j mà j<I và Aj<=Ai}
Duyệt mảng A từ vị trí 1 i-1 với j thỏa L[j] lớn

nhất và Aj<=Ai

Mảng T[i]=j chỉ phần tử đứng trước Ai trong
dãy kết quả là Aj (truy vết kết quả)
09/14/14
15
Dãy con đơn điệu không giảm dài nhất
i 1 2 3 4 5 6 7 8 9 10
A 5 2 3 4 9 10 5 6 7 8
L 1 1 2 3 4 5 4 5 6 7
T 0 0 2 3 4 5 3 7 8 9
09/14/14
16
Bài toán ″Con kiến ″

Bài toán: Trên một sân hình chữ nhật
MxN, được chia thành các ô vuông đơn
vị, mỗi ô chứa một lượng thức ăn. Một
con kiến xuất phát từ ô (1,1) muốnđi
qua sân để đến dòng thứ M. Con kiến
chỉ có thể đi theo một dòng chia nhỏ
trên sân ứng với một dòng của bảng
chữ nhật hoặc đi theo trên một cột của
sân. Hãy chỉ ra đường đi giúp con kiến
có được nhiều thức ăn nhất.
09/14/14
17

FOOD.INP
3 5



FOOD.OUT
45(lượng thức ăn Max)
(1,1)(2,1) (2,2) (2,3) (3,3)
Bài toán ″Con kiến ″
09/14/14
18
Bài toán ″Con kiến ″

Quy tắc đi:

09/14/14
19
Bài toán ″Con kiến ″

Công thức quy hoạch động
B[i,j] là lượng thức ăn lớn nhất đi từ ô
(1,1) đến ô (i,j)
B[1,j]= A[1,j] với j = 1 N
B[i,1]= A[i,1]+B[i-1,1] với i = 2 M
B[i,j]=Max{B[i-1,j],B[i,j-1]} + A[i,j] với i =
2 M và j = 2 N
09/14/14
20
Bài toán ″Sa mạc ″
Một bãi sa mạc có dạng hình chữ nhật MxN.
Mỗi ô vuông đơn vị trên sa mạc có một độ cao
nào đó. Một người muốn đi từ bờ đầu này sang
bờ cuối cùng bên kia. Người đó chỉ có thể đi từ

ô đang đứng tới một ô mới theo hướng thẳng
đứng chéo trái hoặc chéo phải. Giả thiết rằng
người đó không được vượt ra hai mép trái và
phải của sa mạc.
Hãy tìm đường đi sao cho người đó phải vượt
qua quãng đường ngắn nhất.Mỗi lần đi từ một
ô sang ô mới tiếp theo người đó phải đi hết
quãng đường bằng độ chênh cao giữa hai ô đó
09/14/14
21

SAMAC.INP

Bài toán ″Sa mạc ″
09/14/14
22

SAMAC.OUT
12(Quãng đường Min)
(1,3)(2,4) (3,3) (4,2) (5,2)
Quy tắc đi.

09/14/14
23
Công thức QHĐ

B[i,j] là quãng đường nhỏ nhất đi từ bờ đầu
tiên đến ô (i,j).
B[1,j]= 0 với j = 1 N
B[i,1]= Min { B[i-1,1] + abs(A[i,1] - A[i-1,1]);

B[i-1,2]+ abs(A[i,1] - A[i-1,2])}
Với i = 2 M

B[i,j]= Min { B[i-1,j -1] + abs(A[i,j] - A[i-1,j -1]);
B[i-1,j] + abs(A[i,j] - A[i-1,j]);
B[i-1,j+1] + abs(A[i,j] - A[i-1,j+1])}
Với i = 2 M, j = 2 N-1

B[i,N] = Min { B[i-1,N] + abs(A[i,N] - A[i-1,N]);
B[i-1,N-1]+ abs(A[i,N] - A[i-1,N-1])}
Với i = 2 M.
09/14/14
24
Bài toán cắt hình chữ nhật
Có một hình chữ nhật MxN ô, mỗi lần ta được phép cắt
một hình chữ nhật thành hai hình chữ nhật con theo
chiều ngang hoặc chiều dọc và lại tiếp tục cắt các
hình chữ nhật con cho đến khi được hình vuông thi
dừng.
Yêu cầu: Tìm cách cắt hình chữ nhật MxN thành ít hình
vuông nhất.
Ví dụ:

M=10, N=2  số hình vuông 5

M=5, N=6  số hình vuông 5
09/14/14
25
Phân tích
Gọi F(a,b) là số hv ít nhất khi cắt hcn cạnh axb

Ta có công thức QHĐ như sau:
F(a,b) = min{f(a1,b)+f(a2,b),f(a,b1)+f(a,b2)}
Với a = a1 + a2 và b=b1 + b2

×