【JZOJ4710】Value

JZOJ链接
题目很简短,这里就不说大意了
和之前疯狂的火神一题一样,我们首先考虑选择物品的顺序
设答案的选择顺序为 A1,A2,...Am
其中物品 Ai 对后面物品的损失为 Wi(mi)
为了尽可能的避免损失,我们应该把 Wi 较大的物品放到后面
因此我们物品的选择顺序中 Wi 是升序排列的
首先我们把物品按 Wi 降序排序
然后就可以dp啦
Fi,j 为在前i个物品中选择了后j个(为了满足我们的物品选择顺序)
转移方程为 Fi,j=max(Fi1,j,Fi1,j1+ViWi(j1))
取Max作答案即可。

代码

var
    v,w:array[0..5000] of longint;
    f:array[0..5000,0..5000] of int64;
    n,i,j:longint;
    ans:int64;
procedure qsort(l,r:longint);
var
        i,j,mid,t:longint;
begin
        i:=l;
        j:=r;
        mid:=w[(i+j) shr 1];
        repeat
                while w[i]>mid do inc(i);
                while w[j]<mid do dec(j);
                if i<=j then
                begin
                        t:=w[i];
                        w[i]:=w[j];
                        w[j]:=t;
            t:=v[i];
            v[i]:=v[j];
            v[j]:=t;
                        inc(i);
                        dec(j);
                end;
        until i>j;
        if j>l then qsort(l,j);
        if i<r then qsort(i,r);
end;
function max(a,b:int64):int64;
begin
    if a>b then exit(a) else exit(b);
end;
begin
    readln(n);
    for i := 1 to n do
        readln(v[i],w[i]);
    fillchar(f,sizeof(f),0);
    qsort(1,n);
    ans:=0;
    for i  := 1 to n do
        for j := 1 to i do
        begin
            f[i,j]:=max(f[i-1,j],f[i-1,j-1]+v[i]-w[i]*(j-1));
            ans:=max(ans,f[i,j]);
        end;
    writeln(ans);
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值