Skip to main content
  1. Posts/

BZOJ 1649: [Usaco2006 Dec]Cow Roller Coaster (dp,类似01背包)

·3 mins
Table of Contents
Note: This article is available in Chinese only. 本文暂无英文版本。 View original

#

Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 504  Solved: 265 [Submit][Status][Discuss]

Description
#

The cows are building a roller coaster! They want your help to design as fun a roller coaster as possible, while keeping to the budget. The roller coaster will be built on a long linear stretch of land of length L (1 <= L <= 1,000). The roller coaster comprises a collection of some of the N (1 <= N <= 10,000) different interchangable components. Each component i has a fixed length Wi (1 <= Wi <= L). Due to varying terrain, each component i can be only built starting at location Xi (0 <= Xi <= L-Wi). The cows want to string together various roller coaster components starting at 0 and ending at L so that the end of each component (except the last) is the start of the next component. Each component i has a “fun rating” Fi (1 <= Fi <= 1,000,000) and a cost Ci (1 <= Ci <= 1000). The total fun of the roller coster is the sum of the fun from each component used; the total cost is likewise the sum of the costs of each component used. The cows’ total budget is B (1 <= B <= 1000). Help the cows determine the most fun roller coaster that they can build with their budget.

奶牛们正打算造一条过山车轨道.她们希望你帮忙,找出最有趣,但又符合预算的方案.  过山车的轨道由若干钢轨首尾相连,由x=0处一直延伸到X=L(1≤L≤1000)处.现有N(1≤N≤10000)根钢轨,每根钢轨的起点Xi(0≤Xi≤L- Wi),长度wi(l≤Wi≤L),有趣指数Fi(1≤Fi≤1000000),成本Ci(l≤Ci≤1000)均己知.请确定一种最优方案,使得选用的钢轨的有趣指数之和最大,同时成本之和不超过B(1≤B≤1000).

Input
#

  • Line 1: Three space-separated integers: L, N and B.

  • Lines 2..N+1: Line i+1 contains four space-separated integers, respectively: Xi, Wi, Fi, and Ci.

    第1行输入L,N,B,接下来N行,每行四个整数Xi,wi,Fi,Ci.

Output
#

  • Line 1: A single integer that is the maximum fun value that a roller-coaster can have while staying within the budget and meeting all the other constraints. If it is not possible to build a roller-coaster within budget, output -1.

Sample Input
#

5 6 10 0 2 20 6 2 3 5 6 0 1 2 1 1 1 1 3 1 2 5 4 3 2 10 2

Sample Output
#

17 选用第3条,第5条和第6条钢轨

思路:一个类似01dp的背包

dp[i][j]表示长度为i,成本为j的最大有趣指数。

这个想到了。。

然后转移没有推出来。。。

因为潜意识里总觉得循环的变量是要和dp数组的两维一致。。。

实际上根本无关好吗23333

初始化数组dp为-1,dp[0][0]=0

为-1是因为无解输出-1,这样就不用特别处理了。。。

转移方程为:f[i][end[a]]=max{f[i-cost[a][begin[a]]+w[a]} 当f[i-cost[a][begin[a]]可行时

参考了这篇题解:

bzoj1649题解

 1/* ***********************************************
 2Author :111qqz
 3Created Time :2016年04月11日 星期一 16时43分19秒
 4File Name :code/bzoj/1649.cpp
 5************************************************ */
 6
 7#include <cstdio>
 8#include <cstring>
 9#include <iostream>
10#include <algorithm>
11#include <vector>
12#include <queue>
13#include <set>
14#include <map>
15#include <string>
16#include <cmath>
17#include <cstdlib>
18#include <ctime>
19#define fst first
20#define sec second
21#define lson l,m,rt<<1
22#define rson m+1,r,rt<<1|1
23#define ms(a,x) memset(a,x,sizeof(a))
24typedef long long LL;
25#define pi pair < int ,int >
26#define MP make_pair
27
28using namespace std;
29const double eps = 1E-8;
30const int dx4[4]={1,0,0,-1};
31const int dy4[4]={0,-1,1,0};
32const int inf = 0x3f3f3f3f;
33const int N=1E4+3;
34int n,l,b;
35int dp[1005][1005];
36struct node
37{
38    int l,r;
39    int w;
40    int f;
41    int c;
42
43    bool operator < (node b) const
44    {
45	if (l==b.l) return r<b.r;
46	return l<b.l;
47    }
48
49}p[N];
50int main()
51{
52	#ifndef  ONLINE_JUDGE
53	freopen("code/in.txt","r",stdin);
54  #endif
55
56	scanf("%d %d %d",&l,&n,&b);
57	for ( int i = 1 ; i <= n ; i++)
58	{
59	    scanf("%d %d %d %d",&p[i].l,&p[i].w,&p[i].f,&p[i].c);
60	    p[i].r = p[i].l + p[i].w;
61	}
62
63	sort(p+1,p+n+1);
64
65	ms(dp,-1);
66	dp[0][0] = 0;
67	for ( int i = 1 ; i <= n ; i++)
68	{
69	    for ( int j = p[i].c ;  j <= b ; j++)
70		if (dp[p[i].l][j-p[i].c]!=-1) dp[p[i].r][j]=max(dp[p[i].r][j],dp[p[i].l][j-p[i].c]+p[i].f);
71	}
72	int ans = -1 ; //无解输出-1
73	for ( int i = 1 ;i <= b ; i++) ans = max(ans,dp[l][i]);
74	printf("%d\n",ans);
75
76
77
78  #ifndef ONLINE_JUDGE
79  fclose(stdin);
80  #endif
81    return 0;
82}

Related

hdu 1171 Big Event in HDU (母函数,01背包)

·3 mins
**Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 26534 Accepted Submission(s): 9332 ** Problem Description Nowadays, we all know that Computer College is the biggest department in HDU. But, maybe you don’t know that Computer College had ever been split into Computer College and Software College in 2002. The splitting is absolutely a big event in HDU! At the same time, it is a trouble thing too. All facilities must go halves. First, all facilities are assessed, and two facilities are thought to be same if they have the same value. It is assumed that there is N (0<N<1000) kinds of facilities (different value, different kinds).