Luogu 3188
给你 颗宝石,每颗宝石都有重量和价值。要你从这些宝石中选取一些宝石,保证总重量不超过 ,且总价值最大,并输出最大的总价值。
,。
保证每个 能写成 的形式, , ,且答案不超过 。
我擦,背包牛逼题。
注意到这个 的情况里面 很小,能启示我们按照 去分组,组内进行背包。
设 表示 这一组里面的 之和为 的时候价值的最大值,这里我们把 当成了物体的体积。转移是简单的。
但是还有一个问题就是:如何把这些信息合并,让它们放到 里面。设 表示考虑到第 组,当前选择的体积能够表示成 ,其中 满足小于等于 的 位组成的二进制数。
转移考虑枚举当前这一组选了 个,那么剩下了 个,放到前面那组就是 个,还要考虑上新增加的 的第 位,因为 已经贡献到前面的位了。所以有转移:
Luogu 10303
Yazid 今天要听 个人做报告,方便起见,我们把这些人从 至 编号。Yazid 有一个兴奋度,初始为 ,这个值会随着报告的进行而改变。
第 个人()的报告可以用三个数 来描述,这表示假设听他的报告前,Yazid 的兴奋度为 ,那么听完他的报告后,Yazid 的兴奋度将会变成 。
帮助 Yazid 安排确定所有人的报告顺序,使得 Yazid 在所有人报告完后兴奋度最大。
,保证 的绝对值均不超过 。
这个题可以很好的帮助思考最优子结构的本质。一开始想的做法肯定就是记 为听了一些人的报告之后的最大值,转移显然。但是我们发现这个东西并不单调啊,小于 的可能会逆袭啊。
先来考虑 的情况,那么函数就变成了一个 的时候 , 的时候 ,我们就得维护 的最大最小值, 的最大最小值,转移就完了。
但是 不等于 的,那么 的也有可能去 逆袭。那么我们就维护靠近 这段区间的值,但是要维护这个又要维护另一个东西……那我们大不了维护 这段区间所有的值,然后转移只需要这么那么一下就可。
【UR #1】外星人
给定初始值 , 个正整数 ,求有多少个排列 满足按照 执行 之后得到的 最大。
。
考虑如果你在 后面放一个 ,是不是从 这些值的 接下来就随便放了。
那么我们就记 为从 开始,只使用 的值,最终得到的最大值和方案数,转移就枚举下一位放啥,从 转移过来,方案数要乘个系数,懒得写了。