6 条题解
-
0hzszlujy LV 8 @ 2016-11-10 10:35:56
正式数据里面m和n最大才取到500
-
02016-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. -
02015-08-18 13:34:06@
time limit exceeded
下面的程序 -
02014-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时可以通过累加得到 -
02013-10-28 21:36:06@
const 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. -
02013-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
- 分类
- (无)
- 标签
- 递交数
- 619
- 已通过
- 191
- 通过率
- 31%
- 被复制
- 14
- 上传者