[BZOJ4247]挂饰(DP)

当最终挂饰集合确定了,一定是先挂挂钩多的在挂挂钩少的。

于是按挂钩从大到小排序,然后就是简单的01背包。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
 4 using namespace std;
 5 
 6 const int N=2010,inf=1e9;
 7 int f[N][N];
 8 int n,ans=-inf,v,c;
 9 struct P{ int v,c; }s[N];
10 bool operator <(const P &a,const P &b){ return a.v>b.v; }
11 
12 int main(){
13     freopen("bzoj4247.in","r",stdin);
14     freopen("bzoj4247.out","w",stdout);
15     scanf("%d",&n);
16     rep(i,1,n) scanf("%d%d",&s[i].v,&s[i].c);
17     rep(i,0,n) f[0][i]=f[i][n+1]=-inf;
18     f[0][1]=0; sort(s+1,s+n+1);
19     rep(i,1,n) rep(j,0,n) f[i][j]=max(f[i-1][max(j-s[i].v,0)+1]+s[i].c,f[i-1][j]);
20     rep(i,0,n) ans=max(ans,f[n][i]);
21     printf("%d
",ans);
22     return 0;
23 }
原文地址:https://www.cnblogs.com/HocRiser/p/9887785.html