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. MutationObserver

    一.MutationObserver Config childList: 添加.删除目标节点的子节点时会收到通知(子节点的后代节点添加或删除时不会收到通知) attribute: 修改目标节点属性时会 ...

  2. React Native 开发豆瓣评分(一)环境搭建&配置模拟器

    详细可参考 官方文档,这里进记录一些重要过程. 安装环境 下载 Android Studio 选择 Custom 进行安装: Android SDK Android SDK Platform Perf ...

  3. shopxo代码审计

    由于工作原因,分析了很多的cms也都写过文章,不过觉得好像没什么骚操作都是网上的基本操作,所以也就没发表在网站上,都保存在本地.最近突然发现自己博客中实战的东西太少了,决定将以前写的一些文章搬过来,由 ...

  4. 布隆过滤算法体会(BlooomFilter)

    在一个m位的位数组里,一个字符串经过k次hash随机分布到k个位置. http://www.cnblogs.com/aspnethot/articles/3442813.html 布隆filter数据 ...

  5. Docker Compose编排工具部署lnmp实践及理论(详细)

    目录 一.理论概述 编排 部署 Compose原理 二.使用docker compose 部署lnmp 三.测试 四.总结 一.理论概述 Docker Compose是一个定义及运行多个Docker容 ...

  6. SQL SERVER-Extendevent

    事件类介绍 https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/ms188275(v=sql.100)

  7. git命令——git add

    如何理解git add git add命令本身并不复杂,字面意义上理解是“将一个文件添加到项目中“.但是这种理解有缺陷,有时候可能会出现某个文件同时存在暂存区域 和 非暂存区域(staged and ...

  8. 有关Error during sbt execution: No Scala version specified or detected的解决方案--SBT

    sbt 全称为 Simple Build Tool,是 Scala 项目中的标准构建工具,类似于 Java 下的 Maven/Groovy 中的 Gradle. 项目的构建 项目依赖自动化管理 提供统 ...

  9. Centos7安装教程

    1.下载centos7的镜像 到华为云镜像官方网站下载https://mirrors.huaweicloud.com/ 2.创建虚拟机并载入镜像 3.开启虚拟机,正式安装 选择第一项:Install ...

  10. Windows10安装MongoDB4.0详细流程及启动配置

    一.安装 首先去官网下载Mongodb安装包,网址https://www.mongodb.com/download-center/community,下载完成后双击安装就行 安装步骤: 1.点击nex ...