【动态规划】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;
}
posted @ 2015-05-18 17:23  AutSky_JadeK  阅读(247)  评论(0编辑  收藏  举报
TVアニメ「Charlotte(シャーロット)」公式サイト TVアニメ「Charlotte(シャーロット)」公式サイト