【题解】Solution Set - NOIP2024集训Day22 DP常⻅模型 1「序列」& 2「背包」
【题解】Solution Set - NOIP2024集训Day22 DP常⻅模型 1「序列」& 2「背包」
https://www.becoder.com.cn/contest/5507
「SCOI2003」字符串折叠
考虑区间 dp。转移的时候,对于当前状态(区间),枚举左边的循环节长度,用 kmp 求出最长循环距离,然后划分子问题。
如果每次钦定左边取到最长的循环长度,其实算强行加上了一个错误的贪心(虽然有 90pts
我们划分子问题的时候就直接划分就行了,最后看整体能不能压缩就行了。
「ABC221G」Jumping sequence
这道题难做的原因是,横纵坐标在不同的走法下地位不一样,这导致我们无法分开处理。
我们考虑把整个坐标系旋转 \(45^\circ\)。每个操作变换为:(每个操作可以视作一个向量
这样往四个方向走的时候,横纵坐标都会变化 \(\pm d\),这个时候就可以分开处理了。
剩下的简单转化可以参见:这篇题解。
「BZOJ1190 HNOI2007」梦幻岛宝珠
就是 0-1 背包,但是背包容量为 \(2^{30}\)。
假如所有的 \(b\) 都相同,显然我们可以把所有的 \(w_i\gets w_i/2^b,W\gets W/2^b\),现在背包的容量一定不会超过 \(\sum a\le 10n\)。
所以,我们考虑把 \(b\) 不同的分开跑背包 \(f\)。
现在考虑背包的合并。
考虑把 \(W\) 而也二进制拆分。
(没想出来。
https://www.luogu.com.cn/article/nnsuyx54
Hummmmm,似乎也算是对 \(W\) 二进制拆分。因为在第一个 dp 里面,我们对于任意的容量,都算了答案。而在合并的时候,我们只需要知道 \(W\) 的答案。
为了合并,我们考虑重新拿出一个 dp:\(g_{i,j}\) 表示 \(b\) 小于等于 \(i\) 的合并起来,当前 \(b=i\) 的选择了 \(j\) 个,同时我们要求权值和小于等于 \(W\)。
有转移:
「CF1866E」Elevators of Tamem
有点奇怪,只有三台电梯。
我们要设计的状态应该跟上一次这台电梯使用时间有关,因为在此期间的 \(A\) 我们都可以使用,并且我们一定会选择最小的用。
(md,一开始以为状态数是 \(O(N^3)\) 的,还不敢这么定义。😥
\(f_{i,a,b,c}\) 第 \(i\) 次事件 1 时,三台电梯上一次使用时间分别是 \(a,b,c\) 的最优解。
\(g_{t,i,j}\) 第 \(t\) 台电梯,在 \([i,j]\) 时间内可用时的最小花费。
\(ti(i)\) 第 \(i\) 次事件 1 时的时间。
这样我们就有了一个 \(O(Q^4)\) 的做法。bf
(调了好久……
现在考虑优化。
实际上,一定是有 \(i=\max\{a,b,c\}\),所以我们在枚举 \(a,b,c,k\) 的时候可以少枚举一个,钦定她等于 \(i-1\)。这样我们精细实现一下,就变成 \(O(n^3)\) 了。
「CF500F」New Year Shopping
题目的意思就是可以在一个区间都加入一个物品,查询单点的 0-1 背包。
一个线段树分治的做法。
把每个物品的区间分成线段树上的 \(\log\) 个节点,并且挂上去。
把每个询问挂在叶子节点上。
一个询问可以用的物品就是其到根路径上的所有物品,我们维护以下这些物品,到叶子节点的时候 0-1 背包就行。
时间复杂度 \(O(bn\log t)\)