NOIP2024集训Day22 DP常见模型1 & 2 - 序列 & 背包

NOIP2024集训Day22 DP常见模型1 & 2 - 序列 & 背包

A. [SCOI2003] 字符串折叠

因为前面折叠了会对后面产生影响,所以很显然不能贪心。

考虑区间DP。

定义 \(f_{i, j}\) 表示 \(i\)\(j\) 范围内可以折叠到的最短长度。答案为 \(f_{1, n}\)

状态转移:对于 \(f_{i, j}\),使用区间DP惯用套路,枚举 \(k\),那么 \(f_{i, j}\) 就有两种情况:

  1. 直接由 \([i, k]\)\([k + 1, j]\) 拼接起来
  2. \([i, k]\) 作为模板串,将 \(s_{i, j}\) 写成 \(x\)\(s_{i, k}\) 的形式,但前提是此举可行(每次枚举 \(k\) 的时候暴力判断)

最坏时间复杂度为 \(O(n^4)\),但其实远远达不到。


B. [ABC221G] Jumping Sequence

非常巧妙。

将坐标系顺时针旋转 \(45^\circ\),也就是说把曼哈顿距离转化成切比雪夫距离,\((X, Y) \rightarrow(\dfrac{X+Y}{2}, \dfrac{Y-X}{2})\),不用考虑 \(\sqrt{2}\) 的问题,因为在旋转 \(45^\circ\) 之后整个距离都会变成原来的 \(\dfrac{\sqrt{2}}{2}\) ,然后再整体除以 \(\sqrt{2}\),消除 \(\sqrt{2}\) 带来的影响。

这样一来,我们就可以把横坐标和纵坐标独立开来,方便处理。

于是问题转化为:求序列 \(C_i\),使得 \(\sum C_i\cdot D_i = s(s = \dfrac{X+Y}{2}/\dfrac{Y-X}{2})\)

分开讨论,分别对横坐标和纵坐标进行处理。

再进行一次转化:设 \(\sum D_i = sum\),求出序列 \(C_i\) 等价于在 \(D_i\) 中选取若干个数,使得 \(\sum C_i = \dfrac{sum - s}{2}\)

于是就变成了01背包,用 bitset 优化一下即可。


C. [HNOI2007] 梦幻岛宝珠

转化一下:01 背包,\(n\le100\),但是容量 \(W \le 2^{30}\)。物体的体积可以写成 \(a\times 2^b(a\le 10, b\le 30)\)

发现 \(W\) 太大,而 \(a\)\(b\) 又很小,于是考虑对背包进行分组。

\(f_{i, j}\) 表示第 \(i\) 组容量为 \(j \times 2^i\) 的答案,每一组直接用普通背包做就可以了。

考虑如何合并。

\(2^{i - 1}\) 转移到 \(2^{i}\) 时,我们同样用 \(f_{i, j}\) 表示 \(2^{0\sim i}\) 位,\(j \times 2^{i}\) 时的答案。

我们考虑可以从 \(2^{i - 1}\) 那里拿一些上来。

假设拿上来 \(k\times 2^i\),于是:\(f_{i, j} = \max\limits_{0\le k\le j}\{f_{i - 1, k \times 2 + [W\&2^{i - 1}]}+ f_{i, j - k}\}\)

其中 \([W\&2^{i - 1}]\) 是如果 \(W\) 里面本来可以有 \(2^{i - 1}\),那就可以多拿上来一个,于是这道题就做完了。

时间复杂度 \(\Theta(T\times len\times 10^3\times 10^3)\)


F. [CF500F] New Year Shopping

线段树分治。

按时间将询问离线,然后按时间建线段树,把物品的影响加到 vector,dfs线段树,合并背包即可。

posted @ 2024-09-04 15:41  Leirt_Abu  阅读(26)  评论(0)    收藏  举报