P4138 [JOISC2014]挂饰
P4138 [JOISC2014]挂饰
◦ N个装在手机上的挂饰。挂饰附有可以挂其他挂件的挂钩。每个挂件要么直接挂在手机上,要么挂在其他挂件的挂钩上。直接挂在手机上的挂件最多有1个。此外,每个挂件有一个安装时会获得的喜悦值,用一个整数来表示,可能为负。
◦ 想要选出一些挂饰挂在一起,最大化所有挂饰的喜悦值之和。
◦ 1<=N<=2000
0<=Ai<=N(1<=i<=N)表示挂勾的数量
-10^6<=Bi<=10^6(1<=i<=N)表示喜悦值。
>Solution
◦ 首先贪心的想,如果最终选出的一组挂饰,肯定是从上到下先挂所含挂钩多的。所以先按照挂钩数量从大到小排序。
Why??
(1)0 100 挂钩数 喜悦值
(2)1 100
乱序ans为100
◦ 然后设dp[i][j]前i个挂饰,剩余j个挂钩的最大喜悦值是多少即可。
◦ 转移枚举下一个挂饰是否挂。
◦ 挂,挂钩数更新就 j - 1 + a[i+1],对应的修改喜悦值;不挂,挂钩数就直接转移过来
但是这个值可能是个负数啊,dp[i][0]就不能转移了啊
◦ 转移方程: dp[i][j]=max(dp[i-1][j],dp[i-1][max(j-a[i],0) +1]+v[i])
注意此处为什么是
这个+1放在外面呢???
假设我们挂第 i 个挂饰,那么挂之前有 i-1 个挂饰,有 x 个挂饰,那么 x-1+a[i]=j,
因为挂上第 i 个挂饰要消耗一个挂钩,然后你会得到第 i 个挂饰的挂钩
所以 x = j - a[i] + 1
j-a[i]有可能是负数,一旦是负数,那肯定就不存在此情况,就相当于你把之前的挂饰全从手机上卸下来,然而手机默认自己就有一个挂钩,所以+1放到外面
◦ 注意dp[i][0]不能转移。
状态设计充分描述尽量简洁,什么影响问题就把什么记下来
PS:奉劝各位 f 数组一定要初始化最小值!!!
memset(f,-0x3f3f3f3f,sizeof(f))
(不过你初始化的这个值并不等于-0x3f3f3f3f,是一个绝对值较大的负数
(这个T我写的-0x3f没有事,因为memset是用最后两位来填充的数组
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdlib>
#include<queue> using namespace std; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int maxn=,minn=-;
int n,ans=;
int f[maxn][maxn];
struct node
{
int a,b;
}gou[maxn]; bool cmp(node x,node y)
{
if(x.a==y.a) return x.b >y.b ;
return x.a >y.a ;
} int main()
{
n=read();
for(int i=;i<=n;i++)
gou[i].a =read(),gou[i].b=read();
sort(gou+,gou+n+,cmp);
memset(f,-0x3f,sizeof(f)); f[][]=; for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
f[i][j]=max(f[i-][j],f[i-][max(j-gou[i].a,)+]+gou[i].b ); for(int i=;i<=n;i++)
ans=max(ans,f[n][i]);
printf("%d",ans);
return ;
}
P4138 [JOISC2014]挂饰的更多相关文章
- JOISC2014 挂饰("01"背包)
传送门: [1]:洛谷 [2]:BZOJ 参考资料: [1]:追忆:往昔 •题解 上述参考资料的讲解清晰易懂,下面谈谈我的理解: 关键语句: 将此题转化为 "01背包" 类问题,关 ...
- [JOISC2014]挂饰
嘟嘟嘟 这题其实还是比较好想的,就是有一个小坑点. 首先钩子多的排在前面,然后就是dp了. dp方程就是\(dp[i][j]\)表示到了第\(i\)建物品,还剩\(j\)个挂钩的最大喜悦值.转移就很显 ...
- 洛谷P4138 挂饰 背包
正解:背包dp 解题报告: 昂先放链接qwq 感觉还挺妙的,,,真的我觉得我直接做可能是想不到背包的,,,我大概想不出是个背包的QAQ 但是知道是背包之后觉得,哦,好像长得也确实挺背包的吼,而且其实是 ...
- BZOJ4247挂饰
Description JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同--其中的一些挂饰附有可以挂其他挂件的挂钩 ...
- BZOJ 4247: 挂饰 题解
Description JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同--其中的一些挂饰附有可以挂其他挂件的挂钩.每个挂件要么直 ...
- BZOJ 4247 挂饰 背包DP
4247: 挂饰 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- bzoj千题计划197:bzoj4247: 挂饰
http://www.lydsy.com/JudgeOnline/problem.php?id=4247 先把挂饰按挂钩数量从大到小排序 dp[i][j]前i个挂饰,剩下j个挂钩的最大喜悦值 分挂和不 ...
- BZOJ4247 : 挂饰
首先将挂饰按照挂钩个数从大到小排序,然后DP 设f[i][j]处理完前i个挂饰,还有j个多余挂钩的最大喜悦值,则 f[0][1]=0 f[i][j]=max(f[i-1][max(j-a[i],0)+ ...
- bzoj4247挂饰——压缩的动态规划
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4247 1.dp之前要先按挂钩个数从大到小排序,不然挂钩一度用成负的也可能是正确的,不仅脚标难 ...
随机推荐
- 第十章、jupyter入门之pandas
目录 第十章.jupyter入门之pandas 一.什么是pandas 二.Series 三.基本概念 四.基本运算 五.DataFrame 第十章.jupyter入门之pandas 一.什么是pan ...
- svn+jenkins自动部署
需求:项目经理想要将原型图修改完后直接发布 前置条件: 已经有了svn服务器,并正常使用 已经有了jenkins服务器,之前搭建的gitlab+jenkins, 如需搭建jenkins,参考 http ...
- Win7系统打开防火墙出现0x6D9错误的解决方法
防火墙是Windows系统内的一道屏障,开启防火墙可以对系统起到一定的保护作用,可以说非常重要.但是有些Win7系统用户在开启防火墙时会被系统提示出现0x6D9的错误代码,从而不能打开防火墙. 当我们 ...
- 网络初级篇之STP(BPDU详解与STP故障恢复)
一.BPDU包含的参数 通过STP的原理,我们学习了红色部分的字段(根桥ID.根路径开销.桥ID.端口ID).现在讲解一下黄色部分的字段(类型.计时器.老化时间.访问时间) 1.(BPDU Type) ...
- ngnix 配置说明
#定义Nginx运行的用户和用户组 user www www; # #nginx进程数,建议设置为等于CPU总核心数. worker_processes ; # #全局错误日志定义类型,[ debug ...
- Kaggle_泰坦尼克乘客存活预测
转载 逻辑回归应用之Kaggle泰坦尼克之灾 此转载只为保存!!! ————————————————版权声明:本文为CSDN博主「寒小阳」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附 ...
- BZOJ 1005 prufer序列
给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? 第一行为N(0 < N < = 1000),接下来N行,第i+1行给出第i个节点的度数Di ...
- Python:面向对象编程3 定制类(有更新)
Python:面向对象编程3 定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...
- string::append
string (1) string& append (const string& str); substring (2) string& append (const strin ...
- nginx第七天
nginx的proxy_buffering和proxy_cache 两个都是nginx代理中内存设置相关的参数. proxy_buffering设置 proxy_buffering主要是实现被代理服务 ...