【题解】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\)。每个操作变换为:(每个操作可以视作一个向量

\[\begin{aligned} L(-d,0)&\to L^\prime(-d,-d)\\ R(d,0)&\to R^\prime(d,d)\\ U(0,d)&\to U^\prime(d,-d)\\ D(0,-d)&\to D^\prime(-d,d) \end{aligned} \]

这样往四个方向走的时候,横纵坐标都会变化 \(\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\)

有转移:

\[g_{i,j}=\max_{k=0}^{j}\{g_{i-1,k<<1|[m>>(i-1))\&1]}+f_{i,j-k}\} \]


「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 时的时间。

\[f_{i,i,b,c}=\min_{k=0}^{i-1}(f_{i-1,k,b,c}+g_{0,ti(k)+1,ti(i)}\times |y_k-x_i|)+A_{ti(i)}|y_i-x_i|\\ f_{i,a,i,c}=\min_{k=0}^{i-1}(f_{i-1,a,k,c}+g_{1,ti(k)+1,ti(i)}\times |y_k-x_i|)+A_{ti(i)}|y_i-x_i|\\ f_{i,a,b,i}=\min_{k=0}^{i-1}(f_{i-1,a,b,k}+g_{2,ti(k)+1,ti(i)}\times |y_k-x_i|)+A_{ti(i)}|y_i-x_i|\\ \]

这样我们就有了一个 \(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)\)

posted @ 2024-09-04 08:14  CloudWings  阅读(24)  评论(1编辑  收藏  举报