ZR#998

解法:

先把所有物品按照拿走的时间从小到大排序,拿走的时间相同就按照放上去的时间从大到小。那么一件物品上方的物品就一定会在它的前面。

考虑 $ dp $ ,设 $ f[i][j] $ 表示 $ i $ 以及 $ i $ 上面物品在所有时刻中最大重量为 $ j $ 时的最大收益。

转移的时候,我们需要枚举所有 $ i $ 上面的物品,维护一个 $ g[i] $ 表示时刻 $ i $ 之前物品的最大收益是多少。然后直接转移就好了。

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath> using namespace std; #define LL long long
#define N 100010 struct Node {
int in,out;
int w,s,v;
inline bool operator < (const Node &x) const {
if(in != x.in) return in < x.in;
else return out > x.out;
}
} a[N]; int f[1010][2010],n,ans,s; int main() {
scanf("%d%d",&n,&s);
for(int i = 1 ; i <= n ; i++)
scanf("%d%d%d%d%d",&a[i].in,&a[i].out,&a[i].w,&a[i].s,&a[i].v);
sort(a + 1,a + n + 1);
for(int i = 1 ; i <= n ; i++) {
int u = min(s,a[i].s);
for(int j = 0 ; j <= u ; j++) {
f[i][j] = a[i].v;
int sum = 0;
for(int k = i - 1 ; k >= 1 ; k--) {
if(a[k].out >= a[i].out) f[i][j] = max(f[i][j],f[k][j + a[i].w] + a[i].v + sum);
if(a[k].out <= a[i].in && a[k].s <= j + a[i].w) sum += a[k].v;
}
ans = max(ans,f[i][j]);
}
}
printf("%d \n",ans);
//system("pause");
return 0;
}

补充,因为写完题解就被叉了,所以补一发改过后的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath> using namespace std; #define LL long long
#define N 1010 struct bag {
int in, out;
int w, s, v;
} d[N];
int n,S,f[N][N],g[N][N]; inline bool cmp(bag a, bag b) {
if (a.out == b.out)return a.in > b.in;
else return a.out < b.out;
} int main() {
scanf("%d%d",&n,&S);
for(int i = 1 ; i <= n ; i++)
scanf("%d%d%d%d%d",&d[i].in,&d[i].out,&d[i].w,&d[i].s,&d[i].v);
d[0].out = 2 * n + 1,d[0].s = S;
sort(d,d + n + 1,cmp);
for(int i = 0 ; i <= n ; i++) {
int j = 0, t = min(d[i].s, S - d[i].w);
memset(g,0,sizeof(g));
while(d[j].out <= d[i].in) j++;
for(int k = d[i].in + 1 ; k <= d[i].out ; k++) {
memcpy(g[k],g[k-1],sizeof(g[k]));
while(j < i && d[j].out == k) {
if(d[j].in < d[i].in) {
j++;
continue;
}
for(int l = 0 ; l <= t ; l++)
g[k][l] = max(g[k][l], g[d[j].in][l] + f[j][l]);
j++;
}
}
for(int k = 0 ; k <= t ; k++)
f[i][k + d[i].w] = g[d[i].out][k] + d[i].v;
for(int k = 1 ; k <= S ; k++)
f[i][k] = max(f[i][k], f[i][k - 1]);
}
printf("%d\n", f[n][S]);
//system("pause");
return 0;
}

ZR#998的更多相关文章

  1. NYOJ 998

    这道题是欧拉函数的使用,这里简要介绍下欧拉函数. 欧拉函数定义为:对于正整数n,欧拉函数是指不超过n且与n互质的正整数的个数. 欧拉函数的性质:1.设n = p1a1p2a2p3a3p4a4...pk ...

  2. labview出现系统998错误

    1.环境:xp,labview2015, 2.经过:初始状态正常,系统需要运行2016的打包的程序,运行不了,后下载了一个2016打包后的程序,点击安装,未提示异常.桌面添加了快捷方式,点击快捷方式, ...

  3. 关于python最大递归深度 - 998

    今天LeetCode的时候暴力求解233 问题: 给定一个整数 n,计算所有小于等于 n 的非负数中数字1出现的个数. 例如: 给定 n = 13, 返回 6,因为数字1出现在下数中出现:1,10,1 ...

  4. 仓位 001 998 AUFNAHME不存在(L9009)

    测试做一个物料库存561初始化时,库位是上启用了WM的.提示“C01 998 AUFNAHME 不存在”,998 库存余额的初始条目 是缺省的存储类型.用LS25在正式系统中,CO1 998下有AUF ...

  5. cogs 998. [東方S2] 帕秋莉·诺蕾姬

    二次联通门 : cogs 998. [東方S2] 帕秋莉·诺蕾姬 交上去后发现自己没上榜 就想着加点黑科技 把循环展开一下 结果WA了.. 万恶的姆Q /* cogs 998. [東方S2] 帕秋莉· ...

  6. ZR#1005

    ZR#1005 解法: 题解给了一个建图跑最短路的做法,但好像没有必要,因为 $ m $ 没有用,所以直接上完全背包就行了. CODE: #include<iostream> #inclu ...

  7. ZR#1004

    ZR#1004 解法: 对于 $ (x^2 + y)^2 \equiv (x^2 - y)^2 + 1 \pmod p $ 化简并整理得 $ 4x^2y \equiv 1 \pmod p $ 即 $ ...

  8. ZR#1009

    ZR#1009 解法: 因为无敌的SR给了一个大暴力算法,所以通过打表发现了了一些神奇的性质,即第一行和第一列的对应位置数值相等. 我们可以通过手算得出 $ F(n) = \frac{n(n + 1) ...

  9. ZR#1008

    ZR#1008 解法: 直接预处理出来执行完一个完整的串可以到达的位置,然后算出重复的次数直接乘在坐标上,最后处理一下余下的部分就行了. CODE: #include<iostream> ...

随机推荐

  1. SQL链接服务器查询-OPENQUERY的使用

    OpenQuery: 用途:与其他Server交互的技术,通过它能够直接访问其他数据库资源.可以跨平台连接,包括Oracle   --创建链接服务器 exec sp_addlinkedserver ' ...

  2. axios 发 post 请求,后端接收不到参数的解决方案(转载)

    原文地址:https://www.cnblogs.com/yiyi17/p/9409249.html 问题场景 场景很简单,就是一个正常 axios post 请求: axios({ headers: ...

  3. Self寄宿

    static void Main(string[] args) { //Assembly.Load("WebApplication1, Version=1.0.0.0, Culture=ne ...

  4. vue+axios通过formdata提交参数和上传文件

    demo.vue 文件 <template> <div class="demo"> <input v-model="importForm.m ...

  5. oracle:sql添加合计语句(union)

    转自:https://blog.csdn.net/qq_43563538/article/details/90370925 原表见下图: 查询全部的语句: SELECT * from BD_MARK_ ...

  6. linux跳板机开发之trap信号机应用

    场景1:公司新招聘了一个配置管理员,他的工作是负责将公司开发人员写的新代码依次分发到办公室测试环境.IDC测试环境和正式线上环境.因此公司需要开发一个程序,当配置管理员登录服务器,只能进入分发的管理界 ...

  7. STM32 HAL库学习系列第8篇---回调函数总结

    普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返 ...

  8. Redis数据缓存淘汰策略【FIFO 、LRU、LFU】

    FIFO.LFU.LRU FIFO:先进先出算法 FIFO(First in First out),先进先出.在FIFO Cache设计中,核心原则就是:如果一个数据最先进入缓存中,则应该最早淘汰掉. ...

  9. Spring Cloud 之 全局配置

    在微服务架构中,全局配置的重要性不言而喻.SpringCloud的全局配置存储主要基于 Git 来实现,即配置信息存储在Git服务器,以统一的方式对外提供访问.在使用上分为 ConfigServer和 ...

  10. VirtualBox、VMware在桥接模式下无法获取ip地址问题

    声明: 参考 https://blog.csdn.net/lcdcxy/article/details/49362171 https://jingyan.baidu.com/article/948f5 ...