【动态规划】bzoj1649 [Usaco2006 Dec]Cow Roller Coaster
很像背包。
这种在一个数轴上进行操作的题常常需要对区间排序。
f[i][j]表示距离到i时,花费为j时的权值之和。
f[x[i]+l[i]][j+c[i]]=max{f[x[i]][j]+w[i]}(1<=i<=n,0<=j<=B)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct Line{int x,l,w,c;}a[10001]; bool operator < (Line a,Line b){return a.x<b.x;} int m,n,Lim,f[1001][1001],nn,ans=-1; int main() { // freopen("bzoj1649.in","r",stdin); int x,l,w,c; scanf("%d%d%d",&m,&n,&Lim); for(int i=1;i<=n;++i) { scanf("%d%d%d%d",&x,&l,&w,&c); if(x+l<=m) a[++nn]=(Line){x,l,w,c}; } memset(f,-1,sizeof(f)); f[0][0]=0; sort(a+1,a+nn+1); for(int i=1;i<=nn;++i) for(int j=0;j<=Lim-a[i].c;++j) if(f[a[i].x][j]!=-1) f[a[i].x+a[i].l][j+a[i].c]=max(f[a[i].x+a[i].l][j+a[i].c],f[a[i].x][j]+a[i].w); for(int i=0;i<=Lim;++i) ans=max(ans,f[m][i]); printf("%d\n",ans); return 0; }
——The Solution By AutSky_JadeK From UESTC
转载请注明出处:http://www.cnblogs.com/autsky-jadek/