Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:这题cdq大神的插头dp论文里面讲的太详细了,对着写就ok了In Reply To:这题cdq大神的插头dp论文里面讲的太详细了,对着写就ok了 Posted by:ccsu2008021220 at 2010-08-13 16:55:46 > rt! 真的可以吗,我怎么tle了: {$inline on} program pku1739; const p:array[-1..10]of longint=(1,1,3,9,27,81,243,729,2187,6561,19683,59049); var i,j,k,n,m:longint; f:array[0..10,0..10,0..59049]of longint; q:array[0..59049,1..9]of longint; g:array[1..8,1..8]of longint; ch:char; s:array[1..9]of longint; procedure doit(x:longint);inline; var t,i,j,xx:longint; begin t:=0;j:=0;xx:=x; while x>0 do begin i:=x mod 3; inc(j); if i=2 then begin inc(t); s[t]:=j; end; if i=1 then begin if t=0 then exit; q[xx,j]:=s[t]; q[xx,s[t]]:=j; dec(t); end; x:=x div 3; end; end; procedure solve(x,y,z:longint);inline; var x1,x2,x3,x4,zz,j:longint; begin if f[x,y,z]=0 then exit; zz:=z; x1:=z div p[m+1-y]*p[m+1-y]; z:=z mod p[m+1-y]; x4:=z mod p[m+1-y-2]; z:=z div p[m+1-y-2]; x3:=z mod 3; x2:=z div 3; inc(x1,x4); z:=zz; case g[x,y+1]of 0:begin if(x2=0)and(x3=0) then inc(f[x,y+1,x1+p[m+1-y-1]+p[m+1-y-2]*2],f[x,y,z]); if(x2+x3=3)and(q[z,m+1-y-1]<>m+1-y) then inc(f[x,y+1,x1],f[x,y,z]); if(x2+x3=1)and(x2*x3=0) then begin inc(f[x,y+1,x1+p[m+1-y-1]],f[x,y,z]); inc(f[x,y+1,x1+p[m+1-y-2]],f[x,y,z]); end; if(x2+x3=2)and(x2*x3=0) then begin inc(f[x,y+1,x1+p[m+1-y-1]*2],f[x,y,z]); inc(f[x,y+1,x1+p[m+1-y-2]*2],f[x,y,z]); end; if(x2=1)and(x3=1) then begin j:=p[q[z,m+1-y-1]-1]; inc(f[x,y+1,x1-j],f[x,y,z]); end; if(x2=2)and(x3=2) then begin j:=p[q[z,m+1-y]-1]; inc(f[x,y+1,x1+j],f[x,y,z]); end; end; 1:if(x2=0)and(x3=0) then inc(f[x,y+1,x1],f[x,y,z]); 2:begin if(x2+x3=1)and(x2*x3=0) then begin inc(f[x,y+1,x1+p[m+1-y-1]],f[x,y,z]); inc(f[x,y+1,x1+p[m+1-y-2]],f[x,y,z]); end; if(x2+x3=2)and(x2*x3=0) then begin inc(f[x,y+1,x1+p[m+1-y-1]*2],f[x,y,z]); inc(f[x,y+1,x1+p[m+1-y-2]*2],f[x,y,z]); end; if x2+x3=0 then inc(f[x,y+1,x1+p[m+1-y-1]+p[m+1-y-2]*2],f[x,y,z]); end; end; end; begin readln(n,m); for i:=0 to p[9]-1 do doit(i); while n<>0 do begin fillchar(f,sizeof(f),0); f[1,0,0]:=1; for i:=1 to n do begin for j:=1 to m do begin read(ch); if ch='.' then g[i,j]:=0 else g[i,j]:=1; end; readln; end; g[n,1]:=2;g[n,m]:=2; for i:=1 to n do begin for j:=0 to m-1 do for k:=0 to p[m+1]-1 do solve(i,j,k); for k:=1 to p[m+1]-1 do if k mod 3=0 then f[i+1,0,k div 3]:=f[i,m,k]; end; writeln(f[n,m,p[m]+2]); readln(n,m); end; end. Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator