您的位置:首页 > 产品设计 > UI/UE

Value

2016-08-17 22:07 218 查看

Description



Data Constraint



Solution

这道题一眼看过去,跟之前做的一道题很像,以为排个序做个背包就好,但发现O(n*w)会超时,就尴尬了…看一下数据,很明显是要O(n2)Dp。

那要怎么Dp呢。我们先按Wi降序的排序,然后贪心的想,我们一定是从后往前取的。设F[i][j]表示前i个物品,从后往前取了j个的最大价值。那么第i个物品的真正价值就是Vi-Wi*(j-1),即减去对在它后面取的物品(排序在它前面的物品)的影响。

总式为 F[i][j]=Max{ F[i−1][j] , F[i−1][j−1]+v[i]−w[i]∗(j−1) }

Code

Uses Math;

Var
n,Ans:Longint;
a:Array[0..5005] OF Record
v,w:Longint;
End;
f:Array[0..5005,0..5005] OF Longint;

Procedure Init();
Var
i:Longint;
Begin
Readln(n);
For i:=1 To n Do Readln(a[i].v,a[i].w);
End;

Procedure Qsort(i,j:Longint);
Var
l,r,m:Longint;
Begin
If i>=j Then Exit;
l:=i; r:=j; m:=a[(l+r) >> 1].w;
Repeat
While a[l].w>m Do Inc(l);
While a[r].w<m Do Dec(r);
If l<=r Then
Begin
a[0]:=a[l]; a[l]:=a[r]; a[r]:=a[0];
Inc(l); Dec(r);
End;
Until l>r;
Qsort(l,j); Qsort(i,r);
End;

Procedure Work();
Var
i,j:Longint;
Begin
Qsort(1,n);
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]+a[i].v-a[i].w*(j-1));
Ans:=Max(Ans,f[i][j]);
End;
End;

Begin
//Assign(Input,'value.in'); Reset(Input);
//Assign(Output,'value.out'); Rewrite(Output);

Init();
Work();
Writeln(Ans);

//Close(Input); Close(Output);
End.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp noip模拟