MỘT CÁCH TIẾP CẬN MỚI VỀ QUY HOẠCH ĐỘNG

37 923 0
MỘT CÁCH TIẾP CẬN MỚI VỀ  QUY HOẠCH ĐỘNG

Đ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

Trong chiến lược chia để trị, người ta chia bài toán cần giải thành các bài toán con. Các bài toán con lại tiếp tục được chia thành các bài toán con nhỏ hơn, cứ tiếp tục chia cho đến khi ta nhận được các bài toán con có thể giải được dễ dàng. Tuy nhiên, trong quá trình phân chia như vậy, có thể ta sẽ gặp lại rất nhiều lần cùng một bài toán con. Tư tưởng cơ bản của phương pháp quy hoạch động là sử dụng bảng để lưu trữ lời giải của các bài toán con đã được giải. Khi giải bài toán con cần đến nghiệm của các bài toán con cỡ nhỏ hơn, ta chỉ cần lấy lời giải trong bảng mà không cần phải giải lại. Chính vì thế mà các thuật toán được thiết kế bằng phương pháp quy hoạch động sẽ rất hiệu quả.

CHUYÊN ĐỀ MỘT CÁCH TIẾP CẬN MỚI VỀ QUY HOẠCH ĐỘNG Trong chiến lược chia để trị, người ta chia toán cần giải thành toán Các toán lại tiếp tục chia thành toán nhỏ hơn, tiếp tục chia ta nhận toán giải dễ dàng Tuy nhiên, trình phân chia vậy, ta gặp lại nhiều lần toán Tư tưởng phương pháp quy hoạch động sử dụng bảng để lưu trữ lời giải toán giải Khi giải toán cần đến nghiệm toán cỡ nhỏ hơn, ta cần lấy lời giải bảng mà không cần phải giải lại Chính mà thuật toán thiết kế phương pháp quy hoạch động hiệu Để giải toán phương pháp quy hoạch động, cần tiến hành công việc sau: 1) Tìm tham số mô tả toán; 2) Tìm nghiệm toán nhỏ nhất; 3) Tìm công thức (hoặc quy tắc) xây dựng nghiệm toán thông qua nghiệm toán cỡ nhỏ hơn; 4) Tạo bảng (dựa tham số mô tả toán) để lưu trữ nghiệm toán Tính nghiệm toán theo công thức tìm lưu trữ vào bảng; 5) Từ toán giải để tìm nghiệm toán Lớp toán giải phương pháp quy hoạch động • Bài toán tối ưu o Max / Min • Bài toán đếm o Đếm số cấu hình o Thứ tự từ điển • Bài toán lập bảng phương án o Xây dựng cấu hình o Trò chơi Các cách cài đặt • Bottom-up (từ lên) o Khi xác định thứ tự toán cần giải o Cài đặt vòng lặp o Có thể giải thừa toán không cần thiết • Top-down (từ xuống) o Không cần thiết xác định thứ tự toán cần giải o Cài đặt đệ quy có nhớ  đặt cận o Chỉ giải toán cần thiết Độ phức tạp thuật toán thiết kế theo phương pháp quy hoạch động Giả sử toán mô tả tham số cần tính hàm mục tiêu Khi đó, số toán (hay gọi số trạng thái) cần tính Gọi độ phức tạp tính nghiệm toán thông qua nghiệm toán cỡ nhỏ (còn gọi chi phí chuyển trạng thái) Khi độ phức tạp thuật toán bằng: Số trạng thái chi phí chuyển trạng thái ( ) Những vấn đề cần ý giải toán phương pháp quy hoạch động 4.1 Tìm tham số mô tả toán Việc tìm tham số mô tả toán dựa đặc điểm, tính chất toán (công việc gọi đoán nhận trạng thái) Cụ thể, cần xác định có tham số nào, ý nghĩa tham số, miền giá trị tham số Đây công việc quan trọng mang ý nghĩa định đến việc giải toán 4.2 Tối ưu thuật toán Qua cách tính độ phức tạp thuật toán theo phương pháp quy hoạch động (độ phức tạp số trạng thái nhân với chi phí chuyển trạng thái) ta nhận thấy, để giảm độ phức tạp thuật toán giảm thiểu số trạng thái giảm chi phí chuyển trạng thái Một số ví dụ minh hoạ 5.1 Bài toán cắt hình chữ nhật Có hình chữ nhật MxN ô, lần ta phép cắt hình chữ nhật thành hai hình chữ nhật theo chiều ngang chiều dọc lại tiếp tục cắt hình chữ nhật 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 hình vuông Input - Gồm dòng chứa hai số M, N (1≤M,N≤500) Output - Gồm dòng kết số lượng hình vuông hcn.inp 10 hcn.out 5 Phân tích - Dễ nhận thấy toán mô tả hai tham số chiều thứ hai hình chữ nhật, thước giá trị số hình vuông cắt từ hình chữ nhật kích Các toán nhỏ (cơ bản) có - Công thức tính: - Như vậy, có , toán chi phí chuyển toán là: Cài đặt vòng lặp const MAX =500; fi ='hcn.inp'; fo ='hcn.out'; f m,n Khi đó, dùng bảng F[1 500,1 500] để lưu lại - var chiều thứ nhất, :array[1 MAX,1 MAX]of longint; :longint; , độ phức tạp thuật procedure tinh(m,n:longint); var a,b,c,res:longint; begin for a:=1 to m for b:=1 to n begin if a=b then begin f[a,b]:=1; continue; end; res:=a*b; for c:=1 to a-1 if res>(f[c,b]+f[a-c,b]) then res:=(f[c,b]+f[a-c,b]); for c:=1 to b-1 if res>(f[a,c]+f[a,b-c]) then res:=(f[a,c]+f[a,b-c]); f[a,b]:=res; end; end; BEGIN assign(input,fi); reset(input); assign(output,fo); rewrite(output); readln(m,n); tinh(m,n); writeln(f[m,n]); close(input); close(output); END Cài đặt đệ quy có nhớ const MAX =500; fi ='hcn.inp'; fo ='hcn.out'; var f m,n :array[1 MAX,1 MAX]of longint; :longint; function tinh(a,b:longint):longint; var c,res:longint; begin if f[a,b]-1 then exit(f[a,b]); if a=b then begin f[a,b]:=1; exit(f[a,b]); end; res:=a*b; for c:=1 to a-1 if res>(tinh(c,b)+tinh(a-c,b)) then res:=(f[c,b]+f[a-c,b]); for c:=1 to b-1 if res>(tinh(a,c)+tinh(a,b-c)) then res:=(f[a,c]+f[a,b-c]); f[a,b]:=res; exit(f[a,b]); end; BEGIN assign(input,fi); reset(input); assign(output,fo); rewrite(output); readln(m,n); fillchar(f,sizeof(f),255); writeln(tinh(m,n)); close(input); close(output); END 5.2 Bốc sỏi Có đống sỏi xếp thành vòng tròn, đống thứ có viên sỏi Ta có cách bốc sỏi sau: - Chọn hai đống liền có số lượng sỏi lẻ Sau bốc từ hai đống đó, đống viên sỏi; - Chọn hai đống liền sỏi Sau bốc từ hai đống đó, để sau bốc số sỏi lại đống số sỏi ban đầu đống div Yêu cầu: Cho số lượng sỏi ban đầu đống , tính số cách khác để bốc hết tất sỏi Input - Dòng đầu số đống sỏi ; - Dòng thứ hai gồm số mô tả số lượng sỏi đống Output - Gồm dòng số lượng cách khác mod 111539786 BOCSOI.INP BOCSOI.OUT 2 3 1 Subtask 1: Subtask 2: Subtask 3: Dự đoán giới hạn Phân tích giải Với Subtask 1, ta sử dụng tham số để mô tả toán số cách khác để bốc hết tất đống sỏi Dùng mảng F[0 30,0 30,0 30] để lưu kết toán Để thuận tiện viết chương trình giải Subtask 2, ta dùng để mô tả toán (trường hợp 0) dùng mảng F có chiều (mỗi chiều từ đến 30) để lưu trữ Đoạn lệnh để tính cụ thể sau: function qhd(var x:prob):longint; var i,j :longint; z :prob; tmp :longint; begin if f[x[0],x[1],x[2],x[3],x[4]]-1 then exit(f[x[0],x[1],x[2],x[3],x[4]]); tmp:=0; for i:=0 to n-1 begin j:=(i+1) mod n; z:=x; if (z[i]>0) and (z[j]>0) then begin if odd(z[i]) and odd(z[j]) then begin dec(z[i]); dec(z[j]); tmp:=(tmp + qhd(z)) mod NMOD; end; z[i]:=x[i] div 2; z[j]:=x[j] div 2; tmp:=(tmp + qhd(z)) mod NMOD; end; end; f[x[0],x[1],x[2],x[3],x[4]]:=tmp; exit(tmp); end; Số toán theo thuật toán tạp theo thuật toán , chi phí chuyển trạng thái Như vậy, chương trình đáp ứng cho Subtask Với Subtask 3, ta có nhận xét sau: xét đống có số sỏi - - Do dó, độ phức , ta bốc viên để đưa đống sỏi , có cách bốc để đưa đống sỏi viên , có trường hợp xảy ra: , sau viên; Nhận thấy khả không xảy Như vậy, chất độ phức tạp thuật toán giải với Nhưng vấn đề khó khăn khai báo mảng chiều, chiều kích thước 30000 để lưu trữ Để giải vấn đề này, với đống sỏi ta xét giá trị xảy đánh thứ tự giá trị từ nhỏ đển lớn, việc lưu trữ theo số thứ tự giá trị Chương trình hoàn chỉnh const MAX LIMIT NMOD fi fo =5; =28; =111539786; ='bocsoi.inp.'; ='bocsoi.out'; type prob =array[0 MAX]of longint; var s :prob; idx :array[0 30000]of longint; f :array[0 LIMIT,0 LIMIT,0 LIMIT,0 LIMIT,0 LIMIT] of longint; n :longint; ft,gt :text; procedure chuanbi; var i, maxIdx :longint; function getIndex(i:longint):longint; begin if idx[i]-1 then exit(idx[i]); if odd(i) then idx[i]:=getIndex(i-1)+1 else idx[i]:=getIndex(i div 2)+1; exit(idx[i]); end; begin fillchar(idx,sizeof(idx),255); idx[0]:=0; maxIdx:=0; for i:=30000 downto begin idx[i]:=getIndex(i); if idx[i]>maxIdx then maxIdx:=idx[i]; end; // writeln(maxIdx); end; function var i,j y,z tmp begin qhd(var x:prob):longint; :longint; :prob; :longint; for i:=0 to y[i]:=idx[x[i]]; if f[y[0],y[1],y[2],y[3],y[4]]-1 then exit(f[y[0],y[1],y[2],y[3],y[4]]); tmp:=0; for i:=0 to n-1 begin j:=(i+1) mod n; z:=x; if (z[i]>0) and (z[j]>0) then begin if odd(z[i]) and odd(z[j]) then begin dec(z[i]); dec(z[j]); tmp:=(tmp + qhd(z)) mod NMOD; end; z[i]:=x[i] div 2; z[j]:=x[j] div 2; tmp:=(tmp + qhd(z)) mod NMOD; end; end; f[y[0],y[1],y[2],y[3],y[4]]:=tmp; exit(tmp); end; procedure xuly; var i :longint; begin fillchar(f,sizeof(f),255); f[0,0,0,0,0]:=1; fillchar(s,sizeof(s),0); readln(ft,n); for i:=0 to n-1 read(ft,s[i]); writeln(gt,qhd(s)); end; BEGIN chuanbi; assign(ft,fi); reset(ft); assign(gt,fo); rewrite(gt); xuly; close(ft); close(gt); END 5.3 Least-Squares Segmentation (LSS) Ta định nghĩa trọng số đoạn số từ số vị trí thứ i đến vị trí thứ j dãy số nguyên A[1], A[2], , A[N] là: Yêu cầu: Cho dãy số nguyên A gồm N số A[1], A[2], , A[N] số nguyên dương G (1 < G < N) Hãy chia dãy A thành G đoạn để tổng trọng số nhỏ Dữ liệu vào file văn “LSS.INP” có dạng: - Dòng đầu gồm hai số N G (1 < G2 < N < 1001) - N dòng tiếp theo, dòng số nguyên mô tả dãy số A (0p+f[k-1,j-1] then f[i,j]:=p+f[k-1,j-1]; end; end; end; BEGIN assign(input,fi); reset(input); assign(output,fo); rewrite(output); docf; qhd; writeln(f[n,g]:0:2); close(input); close(output); END 5.4 TKSEQ Cho dãy số A gồm N số nguyên số nguyên M Tìm dãy số 1≤i1[...]... không có nghĩa ở đầu Bằng cách xóa một hoặc một vài chữ số của n (nhưng không xóa hết tất cả các chữ số của n) ta nhận được những số mới Số mới được chuẩn hóa bằng cách xóa các chữ số 0 vô nghĩa nếu có Tập số nguyên D được xây dựng bằng cách đưa vào nó số n, các số mới khác nhau đã chuẩn hóa và khác n Ví dụ, với n = 101 ta có thể nhận được các số mới như sau: • Bằng cách xóa một chữ số ta có các số:... tại ngày t Các số trên cùng một dòng được ghi cách nhau bởi ít nhất một dấu cách Kết quả: Ghi ra file văn bản STOCK2.OUT một số nguyên dương duy nhất là tổng lượng tiền nhà đầu tư có được sau D ngày theo cách mua bán cổ phiếu tìm được Ví dụ: STOCK2.INP 2 1 2 1 1 1 1 2 3 STOCK2.OUT 3 6.8 Phân tích (ACMVN2011) Cho một số nguyên dương nguyên tố, có dạng là số Ta gọi là một cách phân tích của số số nguyên... nguyên m, n (1 ≤ m, n ≤ 1000); • Dòng tiếp theo chứa dãy số b1, b2, , bm×n (mỗi số không vượt quá 109); • Dòng tiếp theo chứa số nguyên k (1 ≤ k ≤ 106); • Dòng thứ i trong số k dòng tiếp theo chứa 2 số nguyên pi và qi (i = 1, 2, , k) Hai số liên tiếp trên cùng một dòng được ghi cách nhau bởi dấu cách Kết quả: Ghi ra file văn bản NUMTAB.OUT gồm k dòng, mỗi dòng chứa một số là câu trả lời cho truy vấn theo... từng đôi một, mỗi số có giá trị không vượt quá của các file có khóa truy nhập được lưu trong file thứ Các số trên một dòng cách nhau một dấu cách – thì sau đó là – là các chỉ số Kết quả: Đưa ra file văn bản OPTION.OUT một số nguyên – tổng giá trị lớn nhất của các phần mềm có thể cài đặt Ví dụ: OPTION.INP 6 3 OPTION.OUT 1500 400 1 4 400 2 3 5 100 1 1 34 1000 0 150 1 2 750 0 6.12 Binpacking Một xí nghiệp... là đối với giới trẻ sinh viên Nếu bạn mua một máy tính ở CMA giá từ 8 triệu 799 ngàn đồng trở lên, bạn sẽ được cấp một mã khóa P sử dụng một lần vạn năng và một số nguyên dương Bạn được quy n truy nhập vào trang WEB CMA.Soft.com của cửa hàng Trang WEB này chứa phần mềm, đánh số từ 1 đến Mỗi phần mềm được lưu trữ dưới dạng một file ZIP và được bảo vệ bằng một khóa riêng Khóa này vừa dùng để mở nén... nhiều test Dòng đầu tiên chứa một số nguyên dương không lớn hơn 20 là số lượng các bộ dữ liệu Các dòng tiếp theo chứa các bộ dữ liệu Với mỗi bộ dữ liệu, dòng đầu tiên chứa số nguyên N (1 ≤ N ≤ 200) là số lượng loại M-vaccine Dòng thứ hai chứa một xâu độ dài không vượt quá 10000 là biểu diễn protein P của vi rút POKTE N dòng tiếp theo, mỗi dòng chứa một xâu biểu diễn cho một loại M-vaccine Dữ liệu ra... nguyên dương và gọi là khác nhau nếu tồn tại Hai cách phân tích sao cho Dòng đầu là số Output được thành tích các thừa số ta có 4 cách Input - là các và với Yêu cầu: Đếm số cách phân tích khác nhau Ví dụ, ra thừa số nếu là số bộ dữ liệu trong file, dòng sau, mỗi dòng chứa một số nguyên dương 31 phân tích như sau: - Gồm dòng, mỗi dòng chứa một số là số cách phân tích khác nhau của từng bộ dữ liệu tương... COMPUTER Công ty phần mềm XYZ mới mua máy tính để bàn và máy tính xách tay Giá một chiếc máy tính để bàn là a USD còn giá một chiếc máy tính xách tay là b USD Để tránh sự thắc mắc giữa các phòng ban, Tổng giám đốc đã đưa ra cách phân bổ các máy tính này về phòng ban như sau: - Sắp xếp - Tiến hành phân bổ các máy tính cho các phòng ban bảo đảm nếu phòng ban phòng ban theo thứ tự về mức độ quan trọng của... thứ t trong D dòng tiếp theo chứa n số nguyên dương cho biết giá cổ phiếu của n công ty tại ngày t Các số trên cùng một dòng được ghi cách nhau bởi ít nhất một dấu cách Kết quả: Ghi ra file văn bản STOCK.OUT một số nguyên dương duy nhất là tổng lượng tiền nhà đầu tư có được sau D ngày theo cách mua bán cổ phiếu tìm được Ví dụ: STOCK.INP 2 100 5 15 20 STOCK.OUT 255 17 4 5 7 6 5 5 4 3 10 12 Tìm hiểu chương... hình Cho một bảng số A gồm M dòng, N cột, các giá trị của bảng A chỉ là 0 hoặc 1 Ta muốn cắt bảng A thành các hình chữ nhật con sao cho các hình chữ nhật con có giá trị toàn bằng 1 hay toàn bằng 0 Một lần cắt là một nhát cắt thẳng theo dòng hoặc theo cột của một hình chữ nhật thành hai hình chữ nhật riêng biệt Cứ tiếp tục cắt cho đến khi hình chữ nhật toàn bằng 1 hay toàn bằng 0 Yêu cầu: Hãy tìm cách cắt

Ngày đăng: 13/10/2016, 20:13

Từ khóa liên quan

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

Tài liệu liên quan