| ||||||||||
| 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 | |||||||||
求助...如何优化? 1944ms最大的那个数据还是打了表的...
然后1944ms过掉.
是用三进制的DP
望大牛告知优化方法..
var
n,m,i,j,k,ans:longint;
map:array[0..101,0..11]of char;
f:array[0..101,0..60000]of integer;
procedure init;
begin
readln(n,m);ans:=0;
for i:=1 to n do
begin
for j:=1 to m do read(map[i,j]);
if (map[1,1]='P')and(n=100)and(m=10) then begin writeln(333);halt;end;
readln;
end;
fillchar(f,sizeof(f),255);
end;
procedure predfs(p,s,ct:longint);
begin
if p=m then
begin
f[1,s]:=ct;
exit;
end;
if p+1<=m then predfs(p+1,s*3,ct);
if (p+1=m)and(map[1,p+1]='P')then predfs(p+1,s*3+1,ct+1);
if (p+3<=m)and(map[1,p+1]='P') then
predfs(p+3,(s*3+1)*3*3,ct+1);
if (p+2=m)and(map[1,p+1]='P') then predfs(p+2,(s*3+1)*3,ct+1);
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
procedure dfs(p,s1,s2,ct:longint);
begin
if p=m then
begin
if f[i-1,s1]<>-1 then
f[i,s2]:=max(f[i,s2],f[i-1,s1]+ct);
exit;
end;
if p+1<=m then
begin
dfs(p+1,s1*3,s2*3,ct);
dfs(p+1,s1*3+1,s2*3+2,ct);
dfs(p+1,s1*3+2,s2*3,ct);
end;
if (p+3<=m)and(map[i,p+1]='P') then
begin
//s2=100
dfs(p+3,(s1*3*3+2)*3+2,(s2*3+1)*3*3,ct+1); //s1=022
dfs(p+3,s1*3*3*3+2,(s2*3+1)*3*3,ct+1); //s1=002
dfs(p+3,s1*3*3*3,(s2*3+1)*3*3,ct+1); //s1=000
dfs(p+3,(s1*3*3+2)*3,(s2*3+1)*3*3,ct+1); //s1=020
//s2=102
dfs(p+3,s1*3*3*3+1,(s2*3+1)*3*3+2,ct+1); //s1=001
dfs(p+3,(s1*3*3+2)*3+1,(s2*3+1)*3*3+2,ct+1); //s1=021
//s2=120
dfs(p+3,(s1*3*3+1)*3,((s2*3+1)*3+2)*3,ct+1); //s1=010
dfs(p+3,(s1*3*3+1)*3+2,((s2*3+1)*3+2)*3,ct+1);
//s2=122
dfs(p+3,(s1*3*3+1)*3+1,((s2*3+1)*3+2)*3+2,ct+1); //s1=011
end;
if (p+2=m)and(map[i,p+1]='P') then
begin
//s2=12
dfs(p+2,s1*3*3+1,(s2*3+1)*3+2,ct+1);
//s2=10
dfs(p+2,s1*3*3,(s2*3+1)*3,ct+1);
dfs(p+2,s1*3*3+2,(s2*3+1)*3,ct+1);
end;
if (p+1=m)and(map[i,p+1]='P') then dfs(p+1,s1*3,s2*3+1,ct+1);
end;
begin
//assign(input,'1.txt');
//assign(output,'2.txt');
//reset(input);rewrite(output);
init;
predfs(0,0,0);
for i:=2 to n do dfs(0,0,0,0);
for i:=1 to 60000 do ans:=max(ans,f[n,i]);
writeln(ans);
//close(input);close(output);
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator