分析:
分析:本体类似于经典的完全背包问题,每个阶段解决向上或者向下,而且次数不限,类似于物品个数没有限制。所以f[i,j]的状态可以从f[i-1][k]和f[i][k]中转移过来。
注意边界。
保证时间复杂度是O(nm)即可。
代码:
var f:array [0..10005,0..1005] of longint;
l,h,up,down:array [0..10005] of longint;
pipe:array [0..10005] of boolean;
n,m,k:longint;
procedure init;
var i,ll,hh,wh:longint;
begin
fillchar(pipe,sizeof(pipe),0);
readln(n,m,k);
for i:=0 to n-1 do readln(up[i],down[i]);
for i:=0 to n do begin
l[i]:=1;
h[i]:=m;
end;
for i:=1 to k do begin
readln(wh,ll,hh);
l[wh]:=ll+1;
h[wh]:=hh-1;
pipe[wh]:=true;
end;
end;
procedure main;
var i,j,t,ans:longint;
failure:boolean;
begin
ans:=0;
fillchar(f,sizeof(f),255);
for i:=1 to m do f[0,i]:=0;
for i:=1 to n do begin
for j:=l[i-1] to h[i-1] do
if f[i-1,j]<>-1 then begin
t:=j+up[i-1];
if t>m then t:=m;
if (f[i,t]=-1) or (f[i-1,j]+1