6 条题解
- 
  0hzszlujy LV 8 @ 2016-11-10 10:35:56 正式数据里面m和n最大才取到500 
- 
  0@ 2016-07-17 21:13:12只需O(N^2),简单分析 
 var n,m,p,i,j,temp:longint;
 coin,gold,walktimes:array[0..1001,0..1001] of longint;
 f,cost:array[0..1001] of longint;
 function return(x:longint):longint;
 begin
 if x=1 then x:=n
 else x:=x-1;
 return:=x;
 end;
 begin
 readln(n,m,p);
 for i:=1 to n do
 for j:=1 to m do read(gold[j,i]);
 for i:=1 to n do read(cost[i]);
 for i:=1 to n do walktimes[0,i]:=p;
 for i:=1 to m do
 begin
 temp:=-maxlongint div 3;
 for j:=1 to n do
 begin
 if walktimes[i-1,return(j)]<p then
 begin
 if coin[i-1,return(j)]+gold[i,j]>f[i-1]-cost[j]+gold[i,j] then
 begin
 walktimes[i,j]:=walktimes[i-1,return(j)]+1;
 coin[i,j]:=coin[i-1,return(j)]+gold[i,j];
 end else
 begin
 walktimes[i,j]:=1;
 coin[i,j]:=f[i-1]-cost[j]+gold[i,j];
 end;
 end
 else
 begin
 coin[i,j]:=f[i-1]-cost[j]+gold[i,j];
 walktimes[i,j]:=1;
 end;
 if temp<coin[i,j] then temp:=coin[i,j];
 end;
 f[i]:=temp;
 end;
 writeln(f[m]);
 end.
- 
  0@ 2015-08-18 13:34:06time limit exceeded 
 下面的程序
- 
  0@ 2014-11-03 22:52:13用f(i)表示从还剩下i个单位时间时开始的最大收益,那么它一定是由以前的某个时刻最大收益f(j)(j>i)加上一次行走得到的。因此动态转移方程为: 
 f(i)=max{f(j)+sum(k,j-i)-cost(k)}(i<j<=p+i,1<=k<=n)
 其中j表示以前的某个时刻,k表示行走的起点,sum(k,j-i)为从k出发走(j-i)步的金币数,cost(k)为在工厂k买机器人的支出
 在实现时有所不同,我们可以外循环枚举时间,第二重循枚举起点,第三重枚举走的长度。这样在计算sum时可以通过累加得到
- 
  0@ 2013-10-28 21:36:06const oo=maxlongint shr 1; 
 var i,j,k,l,m,n,P,Ans,NowM,LastM:Longint;
 S,F,Step:array[0..1000,0..1000] of Longint;
 Cost,Last:array[0..1000] of Longint;
 Begin
 Readln(N,M,P);
 For i:=1 to N do
 For j:=1 to M do Read(S[j,i]);
 For i:=1 to N do Read(Cost[i]);
 For i:=2 to N do Last[i]:=i-1;
 Last[1]:=N;
 Fillchar(Step,sizeof(Step),60);
 For i:=1 to M do
 Begin
 NowM:=-oo;
 For j:=1 to N do
 Begin
 If Step[i-1,Last[j]]<P then
 Begin
 If LastM-Cost[Last[j]]>F[i-1,Last[j]] then
 Begin
 F[i,j]:=LastM-Cost[Last[j]];
 Step[i,j]:=1;
 End Else
 Begin
 F[i,j]:=F[i-1,Last[j]];
 Step[i,j]:=Step[i-1,Last[j]]+1;
 End;
 End Else
 Begin
 F[i,j]:=LastM-Cost[Last[j]];
 Step[i,j]:=1;
 End;
 Inc(F[i,j],S[i,Last[j]]);
 If F[i,j]>NowM then NowM:=F[i,j];
 End;
 LastM:=NowM;
 End;
 Writeln(NowM);
 End.
- 
  0@ 2013-08-31 16:06:10沙发 
 const maxn=1000;maxm=1000;
 var
 cost,past:array[0..maxn]of longint;
 coin,f,step:array[0..maxm,0..maxn]of longint;
 n,m,p,pastmax,nowmax,f1,f2,i,j:longint;
 begin
 readln(n,m,p);
 for i:=1 to n do
 for j:=1 to m do read(coin[j,i]);
 for i:=1 to n do read(cost[i]);
 for i:=2 to n do past[i]:=i-1;
 past[1]:=n;
 filldword(step,sizeof(step) shr 2,maxlongint);
 pastmax:=0;
 for i:=1 to m do
 begin
 nowmax:=-maxlongint;
 for j:=1 to n do
 begin
 f1:=pastmax-cost[past[j]]+coin[i,past[j]];
 f2:=f[i-1,past[j]]+coin[i,past[j]];
 if not (step[i-1,past[j]]<p) then begin
 f[i,j]:=f1;
 step[i,j]:=1;
 end
 else begin
 if f1>=f2 then begin
 f[i,j]:=f1;
 step[i,j]:=1;
 end
 else begin
 f[i,j]:=f2;
 step[i,j]:=step[i-1,past[j]]+1;
 end;
 end;
 if f[i,j]>nowmax then nowmax:=f[i,j];
 end;
 pastmax:=nowmax;
 end;
 writeln(nowmax);
 end.
- 1
信息
- ID
- 1815
- 难度
- 5
- 分类
- (无)
- 标签
- 递交数
- 620
- 已通过
- 192
- 通过率
- 31%
- 被复制
- 14
- 上传者