[BZOJ2540]ctsc2000快乐的蜜月(dp+归并排序)

该博客介绍了如何使用动态规划(dp)和归并排序来解决ctsc2000中的‘快乐的蜜月’问题。在k=1的情况下,博主给出了f[i]的计算公式,并详细解释了当k>1时如何扩展这个公式。核心思路是通过维护前i天可以获得的第k大收入f[i,k],利用归并排序确保结果有序且无重复。博主还强调了判断无解的条件是f[n,k-1]=0。" 128055641,756452,解密华为机试Python犯罪时间算法,"['python', '算法', '开发语言', '华为']
摘要由CSDN通过智能技术生成

先考虑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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值