今日も、明日も、輝いている。|

Aquizahv

园龄:2年粉丝:0关注:7

DP题记录

像我这种低批废物,不得不记录一些套路了。


寒假集训 dp 题记录。

P7962 [NOIP2021] 方差

首先观察性质,得到差分可以交换,并且最优情况下是单谷的。

剩下的就比较简单了。把式子化一下,拆成一个差,然后把后项设为状态最大化前项即可。

P8392 [BalticOI 2022] Uplifting Excursion (Day1)

厉害题。首先注意到容量大但是单价小,所以考虑直接贪心,然后反悔。

具体地,把贪心后的重量限制在 (Lm,L] 中,如果不在就贪心地拿出最大/最小。

然后就是 dp,不断拿出、放回元素,慢慢逼近 L。这个过程中背包重量一定可以限制在 (Lm,L+m) 内。

然后观察可得,调整过程中背包重量不会出现两次。因为如果出现两次,它肯定是拿出来若干,再塞回去更少数目,必定不优(前面的贪心保证了不会出现以少换多的情况)。

于是最多也就会操作 2m 个物品,dp 的背包容量就只有 [2m2,2m2] 了。(好像只有 [m2,m2]?)

P7519 [省选联考 2021 A/B 卷] 滚榜

典型的省题题。首先只需找到 bi 的差分,转移时就直接使差分尽可能小,因为题目只求排列方案,与 bi 的分配无关

暴力的想法是枚举差分。但这样甚至是错误的,因为一个排列会被算多次。

AT_abc221_h [ABC221H] Count Multiset

挺神奇的题。

首先容易想到把多重集排个序,然后看成一张柱状图。

然后最直接的想法是,定义 fS,i,x 表示目前总和为 S,摆放了 i 个数,此时摆放的数为 x 的方案数。转移:

fS,i,x=j=0min(m,i)fSxj,ij,x1

这个东西时间复杂度不能接受,为 O(n3)。我们想要优化它,但是貌似难以下手——转移的时候不能用类似前缀和的优化,因为 S 的变化是间隔 x 的,并且 x 这一维显得很浪费。

于是考虑枚举 x,每次只塞一个 x。。。但是还是难以满足题目的需求,并且无法限制 m 个相同的数。

这时候,我们考虑从上往下推!

fS,x 表示总和为 S,当前层宽度为 x 的方案数。

转移:

fS,x=y=0min(m,x)fSx,xy

啊?怎么突然变得这么简单?太神奇了吧。

前缀和优化即可。

(后记:其实在写题解的时候一直在想,要怎么想到这个思路。。。但发现它就是凭空出现的,一个很牛的思路。。。是因为没见过这个套路吗?这谁见过啊。看来这就是所谓的思维题吧。)

AT_agc013_d [AGC013D] Piling Up

考虑画出白球随取的次数变化的图像,容易发现它要么向上,要么不变,要么向下。

如果设 fi,j 表示取了 i 个,目前有 j 个白球,但是这可能会算重(因为拿出球的序列是相同的)。

所以就很套路地强制必须出现 0 个白球的情况。这样不仅能不重不漏,还可以不让白球取到负。所以就加一维 0/1 表示是否有过没有白球的情况。

AT_agc002_f [AGC002F] Leftmost Ball

首先,不妨把第一个出现某个颜色的球涂成白色。

然后你要让每个白球唯一对应一个颜色,否则会算重。

因此从最左侧开始,如果遇到一个白球,那么钦定往右第一个遇到的没有被选过的颜色就是它原本的颜色。

于是这就很像一个拓扑序的问题,必须先选前一个白球才能选这个白球,而必须先选前一个颜色的彩球才能选这个颜色的。

到这里,如果你反应比较快,会发现它其实就把问题简化成了 k=2 的情况,因为剩下的 k2 个可以在放完前两个球之后随便放,而且剩余的空位的个数不受影响。

然后考虑 dp,既然这两个相互独立,那就都设为状态好了。设 fi,j 表示放了 i 个白球,放了 j 个颜色的剩余 k1 个彩球。

如果选择放白球,那么选择唯一。因为肯定要放第一个没有被占的位置。

如果选择放剩余 k1 个彩球,那么第一个彩球肯定放第一个,而后面是没有限制的,没有被占的位置都可以放上,就可以直接组合数。

转移方程的话去看其他题解吧。我认为这个自己很容易写出来。

本文作者:Aquizahv's Blog

本文链接:https://www.cnblogs.com/aquizahv/p/18719215

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Aquizahv  阅读(2)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起