Tải bản đầy đủ (.pdf) (7 trang)

Các bài toán quy về xử lý trạng thái ppt

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 (736.08 KB, 7 trang )

 

1/5


.

Tôi :  t
 . a.
..
,.

 

2/5

I. 
:
[i] (1<=i<=n) |a[i]|<=10^8.  (k<=n)
C (|C|<=2*(10^9)) .
.
).
)
0,1

.
Var n:byte; C:longint;
A:array[1 18]of longint;
x,bestSelection:array[1 18]of byte;
Procedure try(i:byte);
Var


j,k:byte;
Test:longint;
Begin
For j:=0 to 1 do begin
x[i]:=j;
if (i<n) then try(I+1)
else begin
test=0;
for k:=1 to n do inc(test,x[k]*a[k]);
if ((test<=C)and (test>bestsum)) then begin
.
bestsum:=test;
bestselection:=x;
end;
end;
End;
End;
Var n:byte; bestsum,C:longint;
bestselection:longword;
A:array[1 18]of longint;
Procedure duyet;
Var I,k:byte; Test:longint; S,last:longword;
Begin
Bestsum:=0;
Bestselection:=0; 
last:=(1 shl n)- 1; .
For s:=1 to last do begin
Test:=0;
For i:=0 to n-1 do
inc(Test,((s shr I) and 1)*a[i+1]);

If (Test>bestsum) and (Test <=C) then begin
bestsum:= Test;
bestselection:=s;
End;
End;
End;
(n*(2^n), ,
, th hic ý
ng O(n*(2^n)) mt cách rõ ràng nht.

 

3/5
 
Var n:byte;
C,bestsum:longint;
A:array[1 18]of longint;
bestselection:longword;
Procedure duyettrangthaicocchan;
Var I,k:byte;
T : array[0 1 shl 18]of longint; .
S,p,last:longword;
Begin
last:=(1 shl n)- 1; .
Bestsum:=0; Bestselection:=0; T[0]:=0; 

//Tin hành duyt các trng thái.
For s:=1 to last do begin
For i:=0 to n-1 do 
If (((s shr i) and 1)=1) then break;

P:= s and (not (1 shl i));
.
0)
T[s]:=T[p] + a[i+1];
If (T[s]>bestsum) and (T[s]<=C) then begin
bestsum:=t[s];
bestselection:=s;
End;
End;
End;

(i*(2^n)) i . N
 . 1) i ngay
khi i=0.

 

4/5

II. 
Xét bài toán sau: CHESSCBG (
Một bàn cờ thế là một bảng gồm 4 dòng, 4 cột. Mỗi thế cờ là một cách sắp xếp 8 quân cờ, hai quân khác nhau ở hai ô khác nhau. Bài
toán đặt ra là cho hai thế cờ 1 và 2, hãy tìm một số ít nhất bước di chuyển quân để chuyển từ thế 1 sang thế 2; một bước di chuyển
quân là một lần chuyển quân cờ sang ô trống kề cạnh với ô quân cờ đang đứng.
Dữ liệu vào
Từ file văn bản gồm 8 dòng, mỗi dòng là một xâu nhị phân độ dài 4 mà số 1/0 tương ứng với vị trí có hoặc không có quân cờ. Bốn
dòng đầu là thế cờ 1, bốn dòng sau là thế cờ 2.
Dữ liệu ra
Gồm 1 dòng duy nhất là số bước chuyển quân ít nhất
Ví dụ

Input:
1111
0000
1110
0010
1010
0101
1010
0101

Output:
4

Thut toán:  c v 1 dãy 16bit, và chuyn thành 1 s hi th. Sau n hay BFS t nh này tnh kia và
m s bài toán  th ng.
 

5/5
III. Quy H:
sau:

*n. Output: . Sau khi 
.
:(n!) =20i
/sy trong 

s. 
:
. 
jt j+1.

T[SS S.
{a,b,c, di ,b,c,d

 T[ {1,2,5} = 10011= 19 :
- T[ {2,5} = 10010 =18 } + a[3,1];
- T[ {1,5} = 10001 =17 } + a[3,2];
- T[ {1,2} = 00011 = 3 } + a[3,5];
3. => T[19.
t: T[s] = max (T[p] + a[k,j: s k = 1)  j S.
[  = (1 shl n)-1 ]1 giây. 
.

 

6/5
  cho thu trên:
const
fi='maxmatrix.inp';
fo='maxmatrix.out';
maxn=20;
var n:byte; sum:int64; lasts:longword;
a:array[1 maxn,0 maxn]of longint;
status:array[0 (1 shl maxn)] of int64;
truy:array[0 (1 shl maxn)] of byte;
procedure doc;
var f:text; i,j:byte;
begin
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n do begin

for j:=1 to n do
read(f,a[i,j]);
readln(f);
end;
close(f);
end;

function bitoff(s:longword;i:byte):longword; begin
bitoff:=s and (not (1 shl i));
end;
function getbit(s:longword;i:byte):byte; begin
getbit:=(s shr i) and 1;
end;

procedure ghi;
var row:array[1 maxn]of byte;
i,j:byte; s:longword; f:text;
begin
assign(f,fo); rewrite(f);
writeln(f,sum);
s:=lasts;
{row[i] mang nghĩa là ở hàng i, ta sẽ chọn cột row[i]}
for i:=n downto 1 do begin
row[i]:=truy[s];
s:=bitoff(s,truy[s]-1);
end;
for i:=1 to n do
writeln(f,a[i,row[i]],'[',i,',',row[i],']');
close(f);
end;


procedure xuli;
var
i,j,k:byte;
list1:array[1 maxn]of byte;
s,p:longword;
begin
status[0]:=0;
lasts:=(1 shl n) - 1; //trạng thái hoàn thành

{Tính các trạng thái}
for s:=1 to lasts do begin
{giải mã trạng thái s: list1 sẽ lưu các vị trí bit=1,
k là số lượng bit=1, đồng thời cũng là dòng ta đang xét}
k:=0;
for i:=0 to n-1 do
if getbit(s,i)=1 then begin
inc(k);
list1[k]:=i;
end;

{giả sử chọn cột đầu tiên}
j:=list1[1]+1;
p:=bitoff(s,j-1);
truy[s]:=j;
status[s]:=status[p]+a[k,j];

{xét các cột còn lại}
for i:=2 to k do begin
j:=list1[i]+1;

p:=bitoff(s,j-1);
if status[s]<status[p]+a[k,j] then
begin
status[s]:=status[p]+a[k,j];
truy[s]:=j;
end;
end;
end;
sum:=status[lasts];
end;

begin
doc; xuli; ghi;
end

 Do s hiu ct là  1i din cho ct i+1, Ta có th  li các ct 0n-i
din cho chính ct i.
 

7/5


(n*(2^n))


IV. 
:
QBSELECT, QBGAME, CHESSCBG, LEM2, LEM3, MIXUP2, LASCALE, CHNREST (*), VMMTFIVE

×