先考虑k=1的情况。
f[i]表示前i天可以获得的最大收入。显然f[i]=max(f[i-1],f[ps]+(i-ps)*cost),p为以i结尾的预定。
那么k>1的:
f[i,k]表示前i天可以获得的第k大收入。
f[i]=f[i-1];
然后对于每一个预定p
q1:=f[i];
q2:=f[ps]中每个元素+(i-ps)*cost;
f[i]=merge(q1,q2);
merge为归并排序操作,要保证有序没有重复的数。
核心代码
for i:=1 to Z[12] do
begin
f[i]:=f[i-1];
p:=d[i];
fillchar(q2,sizeof(q2),0);
while p<>nil do
begin
for j:=1 to k do
if (j=1)or(f[p^.s,j-1]>0) then q2[j]:=f[p^.s,j]+(i-p^.s)*cost[p^.id]
else break;
f[i]:=merge(f[i],q2);
p:=p^.next;
end;
end;
细节:判断无解要f[n,k-1]=0才行,因为0也是一种解。
代码
type
hash=^hashnode;
hashnode=record
s,id:longint;
next:hash;
end;
arr=array[0..110]