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.
相关文章推荐
- HashMap对其中value的排序问题
- Redis中的value包含中文显示的问题?
- xaf 学习 RuleUniqueValueAttribute 唯一验证。
- 出现Form action defaulting to 'action' attribute's literal value 警告的原因
- KVC编程指南(Key-Value Coding Programming Guide)
- 关于 java.toString() ,(String),String.valueOf的区别
- 关于error: Error: No resource found that matches the given name (at 'text' with value '@string/hello')
- Java中Map按照Value值进行排序
- DELPHI7下SUPPEROBJECT遍历子对象的name和value
- objectForKey与valueForKey在NSDictionary中的差异
- android TypedValue.applyDimension()的作用
- Mapped Statements collection does not contain value for 解决方法
- 报表统计(七) 访问数据库 利用XValueMember,YValueMembers绑定
- ios开放--objectForKey与valueForKey在NSDictionary中的差异
- value power two
- c#+linq 通过Dictionary的Value查找Key
- struts2 用标签 <s:property value='[]'/> 取值 json 含有转义字符的解决方法
- 遍历hashMap中的所有key和value
- Extjs 2.2下拉框作为Editor的时候提交Value的问题
- [LeetCode270]Closest Binary Search Tree Value