BZOJ4247 挂饰

mac2022-06-30  127

目录

BZOJ4247 挂饰题解code

BZOJ4247 挂饰

题目传送门

题解

一个比较简单的\(Dp\),我们可以发现挂饰的总个数只有2000个,所以如果挂钩的个数超过了2000个,就没有意义去记录了。所以我们记\(f[i]\)表示当前挂钩为\(i\)个的时候能够到达的最大的贡献是多少。然后将挂饰按挂钩个数从大到小排序,进行\(Dp\)即可。

code

#include <bits/stdc++.h> using namespace std; typedef long long ll; bool Finish_read; template<class T>inline void read(T &x){Finish_read=0;x=0;int f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;if(ch==EOF)return;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();x*=f;Finish_read=1;} template<class T>inline void print(T x){if(x/10!=0)print(x/10);putchar(x+'0');} template<class T>inline void writeln(T x){if(x<0)putchar('-');x=abs(x);print(x);putchar('\n');} template<class T>inline void write(T x){if(x<0)putchar('-');x=abs(x);print(x);} /*================Header Template==============*/ const int maxn=2005; const int inf=2e9+500; int n; struct vol { int a,b; bool operator < (const vol &rhs) const { return a>rhs.a; } }v[maxn]; int f[maxn]; int ans=0; /*==================Define Area================*/ int main() { read(n); for(int i=1;i<=n;i++) { read(v[i].a);read(v[i].b); v[i].a--; } sort(v+1,v+1+n); for(int i=0;i<=n;i++) f[i]=-inf; f[0]=f[1]=0; for(int i=1;i<=n;i++) { if(~v[i].a) { for(int j=n;j;j--) f[min(j+v[i].a,n)]=max(f[min(j+v[i].a,n)],f[j]+v[i].b); } else { for(int j=1;j<=n;j++) f[j-1]=max(f[j-1],f[j]+v[i].b); } for(int j=0;j<=n;j++) ans=max(ans,f[j]); } printf("%d\n",ans); return 0; }

转载于:https://www.cnblogs.com/Apocrypha/p/9431697.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)