题目翻译

JOI 君有 n n n 个装在手机上的挂饰,编号为 1 … n 1 \ldots n 1…n。 JOI 君可以将其中一些挂饰装在手机上。
JOI 君的挂饰有一些与众不同——其中的一些挂饰附有挂钩,你可以将其他挂饰挂在挂钩上。 i i i 号挂饰有 A i A_i Ai​ 个挂钩。每个挂件要么直接挂在手机上,要么挂在其他挂件的挂钩上。直接挂在手机上的挂件最多有 1 1 1 个。
此外,每个挂件有一个安装时会获得的喜悦值,用一个整数来表示。如果 JOI 君很讨厌某个挂饰,那么这个挂饰的喜悦值就是一个负数。
JOI 君想要最大化所有挂饰的喜悦值之和。注意不必要将所有的挂钩都挂上挂饰,而且一个都不挂也是可以的。

输入格式

第一行一个整数 n n n,代表挂饰的个数。
接下来 n n n行,第 i i i 行有两个空格分隔的整数 A i A_i Ai​ 和 B i B_i Bi​,表示挂饰 i i i 有 A i A_i Ai​ 个挂钩,安装后会获得 B i B_i Bi​ 的喜悦值。

输出格式

输出一行,一个整数,表示手机上连接的挂饰总和的最大值。

样例

样例输入

5
0 4
2 -2
1 -1
0 1
0 3

样例输出

5

样例说明

挂饰 2 2 2 直接挂在手机上,然后将挂饰 1 1 1 和挂饰 5 5 5 分别挂在挂饰 2 2 2 的两个挂钩上,可以获得最大喜悦值 4 − 2 + 3 = 5 4-2+3=5 4−2+3=5。

分析

首先,这显然是一道01背包问题。定义 d p [ i ] dp[i] dp[i] 为剩余挂饰 i i i 个能获得的最大价值。容易写出 O ( n m ) O(nm) O(nm) 的01板子,可这样会TLE。
不妨设想一下,对于第 i i i 个挂饰,如果之前有超过 n n n 个剩余挂钩,那么就算不用这个挂饰的挂钩,也不影响最后答案。
这样的话,第二重循环便只用循环到 n n n ,时间复杂度 O ( n 2 ) O(n^2) O(n2)。
这里还需要注意两个细节:
1.若 α \alpha α 比 β \beta β 喜悦值大,比 β \beta β挂钩少,若选 β \beta β 是正解,如果 α \alpha α 在 β \beta β 前面,我们选的会是 α \alpha α,如果 β \beta β 在 α \alpha α 前面,则不影响答案。
所以这里要用贪心的思想,将挂钩多的挂饰放在前面处理。
2.第二重循环为什么一个正序一个逆序,这个希望读者自行思考。(提示:一维数组01背包的性质)

代码

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <climits>
using namespace std;
const int MAXN = 2005, inn = INT_MIN;
struct Node {int A, B;
}arr[MAXN * MAXN];
int dp[MAXN];
bool vis[MAXN];
bool cmp(Node x, Node y) {return x.A > y.A;
}
int main() {int n, maxx = 0;scanf("%d", &n);for(int i = 1; i <= n; i ++) {scanf("%d%d", &arr[i].A, &arr[i].B);}sort(arr + 1, arr + 1 + n, cmp);//贪心 for(int i = 1; i <= n; i ++) dp[i] = inn;dp[1] = 0; vis[1] = 1;for(int i = 1; i <= n; i ++) {//01背包 if(arr[i].A > 0) {for(int j = n; j >= 1; j --) { if(!vis[j]) continue;vis[min(j - 1 + arr[i].A, n)] |= vis[j];dp[min(j - 1 + arr[i].A, n)] = max(dp[min(j - 1 + arr[i].A, n)], dp[j] + arr[i].B);}}else {for(int j = 1; j <= n; j ++) {if(!vis[j]) continue;vis[min(j - 1 + arr[i].A, n)] |= vis[j];dp[min(j - 1 + arr[i].A, n)] = max(dp[min(j - 1 + arr[i].A, n)], dp[j] + arr[i].B);}}}for(int i = 0; i <= n; i ++) {maxx = max(maxx, dp[i]);}printf("%d", maxx);return 0;
}

「JOISC 2014 Day4」挂饰(背包DP)题解相关推荐

  1. 「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)

    「JOISC 2020 Day4」治疗计划 description solution 设dpi:1−Ridp_i:1-R_idpi​:1−Ri​ 都能被救治成功的最小花费 两个治疗方案[Li,Ri], ...

  2. 「JOISC 2014 Day1」巴士走读

    「JOISC 2014 Day1」巴士走读 题解部分: (如果不怎么喜欢看推导的人可以直接看下面的关键部分,在段尾会有标注(或者看完定义直接看代码)) 本题让我们求到达点n需要最晚何时到达点1,我们可 ...

  3. 「JOISC 2014 Day3」稻草人

    「JOISC 2014 Day3」稻草人 问题简述 解析 代码 问题简述 链接 https://loj.ac/problem/2880   给定 n n n个稻草人(横纵坐标是不大于 1 0 9 10 ...

  4. bzoj 4247: 挂饰 背包dp

    题意 JOI君有N个装在手机上的挂饰,编号为1-N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同--其中的一些挂饰附有可以挂其他挂件的挂钩.每个挂件要么直接挂在手机上,要么挂在 ...

  5. BZOJ 4247 挂饰 背包DP

    4247: 挂饰 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id ...

  6. bzoj4247: 挂饰(背包dp)

    4247: 挂饰 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1136  Solved: 454 [Submit][Status][Discuss ...

  7. bzoj4244 loj2878. 「JOISC 2014 Day2」邮戳拉力赛 括号序列+背包

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4244 https://loj.ac/problem/2878 题解 挺妙的一道题. 一开始一直 ...

  8. [LOJ#2878]. 「JOISC 2014 Day2」邮戳拉力赛[括号序列dp]

    题意 题目链接 分析 如果走到了下行车站就一定会在前面的某个车站走回上行车站,可以看成是一对括号. 我们要求的就是 类似 代价最小的括号序列匹配问题,定义 f(i,j) 表示到 i 有 j 个左括号没 ...

  9. LOJ #2878. 「JOISC 2014 Day2」邮戳拉力赛 动态规划+括号序列

    神题呀,我们观察到行走的方式一定是一条链+若干条环. 然后环可以看成是一对括号,所以来一个基于括号序的 DP. code: #include <bits/stdc++.h> #define ...

最新文章

  1. 从源码分析DEARGUI之键盘鼠标事件监控
  2. 10个利用Eclipse调试Java的常见技巧
  3. 纪中培训总结(2019年1月21~31日)
  4. 找不同颜色小游戏html源码,Javascript实现找不同色块的游戏
  5. 关于CSDN登录没有微信二维码的问题
  6. matlab如何根据历年gdp找增长规律,中国历年gdp数据图解 中国历年gdp增长率及人均GDP(1978年-2016年)...
  7. 成都盛铭轩:做好主图要从这些方面做
  8. 计算机报名登录老显示验证码错误是怎么回事,为何登录博客时输入了正确的验证码却总提示验证码错误?...
  9. 磊科NBR100企业有线路由器IP和Mac地址绑定教程
  10. flex与相对定位在国内双核浏览器极速模式下的兼容性问题
  11. 真正可用的CSS文字两端对齐
  12. html数据类型判断,JS中判断数据类型的几种方法
  13. vue项目中图片地址生成二维码
  14. 1198:逆波兰表达式
  15. 程序员真的可以轻松来一套苹果全家桶吗
  16. 用matlab求上三角矩阵的逆,现代科学运算—MATLAB语言与应用-中国大学mooc-题库零氪...
  17. Linux下校园网锐捷认证(以湖南农业大学校园网为例)
  18. thinkpad触控笔怎么用_触控笔的这些技巧,你都get到了吗?
  19. 照片压缩软件哪款好用?推荐5款好用的图片压缩软件
  20. 【写博客常用】北邮保研随笔

热门文章

  1. 【BIM模型生成点云数据】revit转obj格式,全网最详细最简单的步骤了!
  2. 土壤温湿度传感器说明书
  3. 数据可视化案例 :球员能力图
  4. 《深度学习》学习笔记(十)
  5. 乌镇互联网大佬晚宴火了;迅雷“内讧”结束;Uber三名安全经理离职丨价值早报
  6. Delphi使用PasLibVlc播放视频
  7. java安全管理器SecurityManager
  8. APP架构设计经验谈:接口的设计
  9. Python是如何进行内存管理的?(图文讲解)
  10. 超详细的 MySQL 学习教程(多实例、附练习、视频讲解持续更新)