[luoguP2854] [USACO06DEC]牛的过山车Cow Roller Coaster(DP + sort)

传送门

先按照起点 sort 一遍。

这样每一个点的只由前面的点决定。

f[i][j] 表示终点为 i,花费 j 的最优解

状态转移就是一个01背包。

——代码

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5
 6 int L, N, B;
 7 int f[10001][1001];
 8
 9 inline int read()
10 {
11     int x = 0, f = 1;
12     char ch = getchar();
13     for(; !isdigit(ch); ch = getchar()) if(ch == ‘-‘) f = -1;
14     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - ‘0‘;
15     return x * f;
16 }
17
18 struct node
19 {
20     int x, w, f, c;
21 }p[10001];
22
23 inline bool cmp(node x, node y)
24 {
25     return x.x < y.x;
26 }
27
28 inline int max(int x, int y)
29 {
30     return x > y ? x : y;
31 }
32
33 int main()
34 {
35     int i, j;
36     L = read();
37     N = read();
38     B = read();
39     for(i = 1; i <= N; i++)
40     {
41         p[i].x = read();
42         p[i].w = read();
43         p[i].f = read();
44         p[i].c = read();
45         p[i].w += p[i].x;
46     }
47     std::sort(p + 1, p + N + 1, cmp);
48     memset(f, -1, sizeof(f));
49     for(i = 0; i <= B; i++) f[0][i] = 0;
50     for(i = 1; i <= N; i++)
51         for(j = B; j >= p[i].c; j--)
52             if(f[p[i].x][j - p[i].c] ^ -1)
53                 f[p[i].w][j] = max(f[p[i].w][j], f[p[i].x][j - p[i].c] + p[i].f);
54     printf("%d\n", f[L][B]);
55     return 0;
56 }

时间: 2024-12-22 21:14:26

[luoguP2854] [USACO06DEC]牛的过山车Cow Roller Coaster(DP + sort)的相关文章

【题解】P2854 [USACO06DEC]牛的过山车Cow Roller Coaster

P2854 [USACO06DEC]牛的过山车Cow Roller Coaster 题目描述 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 o

BZOJ 1649: [Usaco2006 Dec]Cow Roller Coaster( dp )

有点类似背包 , 就是那样子搞... ------------------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ;  i < n ; ++i

poj3257(Cow Roller Coaster)DP

迭代是一开发种技术,用来把系统功能传递到一系列的增量的完整版本,每个版本一个特定固定的时间段被开发,该时间段称之为迭代. 每个迭代的经历过程: 整个迭代过程: 图中颜色代表每次开发每项活动所占的比重不同 迭代式开发的优点: 1.降低风险 2.得到早期用户反馈 3.持续测试和集成 4.适应变更 开发特征: 1.在进行大规模的投资前,就解决了关键的风险问题 2.使的早期用户反馈在初始迭代中就能出现 3.连续进行测试和集成. 4.各个目标里程碑提供了短期的焦点. 5.对过程的测量是通过实现的评定来进行

bzoj1649[Usaco2006 Dec]Cow Roller Coaster*

bzoj1649[Usaco2006 Dec]Cow Roller Coaster 题意: n条钢轨,第i条起点pi,长度为wi,价钱ci,有趣度fi,要求从0修到l使得总价钱不超过b的前提下有趣度和最大.n≤10000,l≤1000,b≤1000. 题解: 首先把钢轨组织成链表.接着dp:f[i][j]表示修到第i处花钱j,则f[i][j]=f[i-wk][j-ck]+fk,k为终点为i的钢轨.边界则设为f[0][j]都为0,f[i][j]都为负无穷,以保证从0开始修. 代码: 1 #incl

【bzoj1649】Cow Roller Coaster

傻逼dp题. dp[i][j]表示用了i长度已花费成本j所能得到的价值. 然后枚举一下铁轨随便做了. 不行就sort一下. #include<bits/stdc++.h> #define inf 1000000007 typedef long long ll; using namespace std; struct Node{int s,c,w,f;}a[100010]; ll f[1005][1005]; bool cmp(Node a,Node b){ if(a.s==b.s)return

POJ - 3257 Cow Roller Coaster (背包)

题目大意:要用N种材料建一条长为L的路,现在给出每种材料的长度w,起始地点x,发费c和耐久度f 问:在预算为B的情况下,建好这条路的最大耐久度是多少 解题思路:背包问题 dp[i][j]表示起始地点为i,发费为j的最大耐久度 可得转移方程 dp[i + w][j + c] = max(dp[i + w][j + c],dp[i][j] + f) #include<cstdio> #include<cstring> #include<algorithm> using na

【动态规划】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

【题解】[Usaco2006 Dec]Cow Roller Coaster

01背包,难点在于多了一个维度(二维01背包) 有费用(成本这里称"奶牛币"),有价值(有趣指数这里称"fun值"),还有一个限制条件--轨道要求连续,切必须到达终点 既然有两个限制维度,那咱就开一个二维数组:F[i][j](为了避免与变量名重复,我这里使用大写F,代码里用小写f) F[i][j]表示:从轨道的起点某起点使用轨道,花费j奶牛币,到达该轨道的终点i,可以获得的最大的fun值 于是就有方程: F[x[i]+w[i]][j]=max(F[x[i]+w[i]

洛谷 P2853 [USACO06DEC]牛的野餐Cow Picnic

P2853 [USACO06DEC]牛的野餐Cow Picnic dfs 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,k,p[10000],can[10000]; 4 int w[1000+15][1000+15]; 5 bool vis[10000]; 6 7 void dfs(int pre) 8 { 9 for(int j=1;j<=n;j++) 10 { 11 if(w[pre][j]&&!