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

L(d,0)L(d,d)R(d,0)R(d,d)U(0,d)U(d,d)D(0,d)D(d,d)

这样往四个方向走的时候,横纵坐标都会变化 ±d,这个时候就可以分开处理了。

剩下的简单转化可以参见:这篇题解


「BZOJ1190 HNOI2007」梦幻岛宝珠

就是 0-1 背包,但是背包容量为 230

假如所有的 b 都相同,显然我们可以把所有的 wiwi/2b,WW/2b,现在背包的容量一定不会超过 a10n

所以,我们考虑把 b 不同的分开跑背包 f

现在考虑背包的合并。

考虑把 W 而也二进制拆分。

(没想出来。


https://www.luogu.com.cn/article/nnsuyx54

Hummmmm,似乎也算是对 W 二进制拆分。因为在第一个 dp 里面,我们对于任意的容量,都算了答案。而在合并的时候,我们只需要知道 W 的答案。

为了合并,我们考虑重新拿出一个 dp:gi,j 表示 b 小于等于 i 的合并起来,当前 b=i 的选择了 j 个,同时我们要求权值和小于等于 W

有转移:

gi,j=maxk=0j{gi1,k<<1|[m>>(i1))&1]+fi,jk}


「CF1866E」Elevators of Tamem

有点奇怪,只有三台电梯。

我们要设计的状态应该跟上一次这台电梯使用时间有关,因为在此期间的 A 我们都可以使用,并且我们一定会选择最小的用。

(md,一开始以为状态数是 O(N3) 的,还不敢这么定义。😥

fi,a,b,ci 次事件 1 时,三台电梯上一次使用时间分别是 a,b,c 的最优解。

gt,i,jt 台电梯,在 [i,j] 时间内可用时的最小花费。

ti(i)i 次事件 1 时的时间。

fi,i,b,c=mink=0i1(fi1,k,b,c+g0,ti(k)+1,ti(i)×|ykxi|)+Ati(i)|yixi|fi,a,i,c=mink=0i1(fi1,a,k,c+g1,ti(k)+1,ti(i)×|ykxi|)+Ati(i)|yixi|fi,a,b,i=mink=0i1(fi1,a,b,k+g2,ti(k)+1,ti(i)×|ykxi|)+Ati(i)|yixi|

这样我们就有了一个 O(Q4) 的做法。bf

(调了好久……


现在考虑优化。

实际上,一定是有 i=max{a,b,c},所以我们在枚举 a,b,c,k 的时候可以少枚举一个,钦定她等于 i1。这样我们精细实现一下,就变成 O(n3) 了。


「CF500F」New Year Shopping

题目的意思就是可以在一个区间都加入一个物品,查询单点的 0-1 背包。

一个线段树分治的做法。

把每个物品的区间分成线段树上的 log 个节点,并且挂上去。

把每个询问挂在叶子节点上。

一个询问可以用的物品就是其到根路径上的所有物品,我们维护以下这些物品,到叶子节点的时候 0-1 背包就行。

时间复杂度 O(bnlogt)

posted @   CloudWings  阅读(30)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示