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 |
我的程序:In Reply To:我NOI数据全过了怎么WA? Posted by:dfg at 2005-07-13 12:09:33 Program cannon; Const fin ='cannon.in'; fout ='cannon.out'; Var d,l,ld :array[1..100]of longint; a :array[1..10]of boolean; opt1,opt :array[1..100,1..100]of longint; ch :char; n,m,i,j,p,top,ans,s,max :longint; Function binva:longint; var i,v:longint; begin v:=0; for i:=1 to m do v:=v shl 1+ord(a[i]); binva:=v; end; Procedure search(p,r:longint); begin if r=0 then begin inc(top); d[top]:=binva; l[top]:=i; end else if p<=m then begin search(p+1,r); a[p]:=true; search(p+3,r-1); a[p]:=false; end; end; Function ok(a,b:longint):boolean; begin ok:=(a>=b) and (a xor b=a-b); end; Begin {readin} assign(input,fin); reset(input); readln(n,m); for i:=1 to n do begin for j:=1 to m do begin read(ch); a[j]:=ch='P'; end; ld[i]:=binva; readln; end; close(input); {main} {init} top:=0; fillchar(a,sizeof(a),0); {dp} if n=1 then ans:=(m-1) div 3+1 else begin for i:=0 to 4 do search(1,i); for i:=1 to top do if ok(ld[1],d[i]) then for j:=1 to top do if ok(ld[2],d[j]) then if d[i] or d[j]=d[i]+d[j] then opt[i,j]:=l[i]+l[j]; for s:=3 to n do begin opt1:=opt; for i:=1 to top do if ok(ld[s-1],d[i]) then for j:=1 to top do if ok(ld[s],d[j]) and (d[i] or d[j]=d[i]+d[j]) then begin max:=0; for p:=1 to top do if ok(ld[s-2],d[p]) and (d[p] or d[i] or d[j]=d[p]+d[i]+d[j]) then if max<opt1[p,i]+l[j] then max:=opt1[p,i]+l[j]; opt[i,j]:=max; end; end; ans:=0; for i:=1 to top do if ok(ld[n-1],d[i]) then for j:=1 to top do if ok(ld[n],d[j]) and (d[i] or d[j]=d[i]+d[j]) then if ans<opt[i,j] then ans:=opt[i,j]; end; {printout} assign(output,fout); rewrite(output); writeln(ans); 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