[2021 Summer Petrozavodsk Camp, Day 3: IQ test] D. Deleting
[2021 Summer Petrozavodsk Camp, Day 3: IQ test] D. Deleting
题目描述
你有一个数组 \([1, 2, \ldots, n]\),其中 \(n\) 是偶数。
每次你可以选择两个相邻的元素删除,如果这两个元素为 \(i\) 和 \(j\),那么代价为 \(cost(i, j)\)。
你可以用 \(n/2\) 轮将所有元素删完,问这 \(n/2\) 次删除操作代价的最大值最小是多少?
思路
首先不难得到一个 \(\mathcal{O}(n^3)\) 的 \(\rm{DP}\) 做法: 令 \(f_{i, j}\) 表示当前消除掉 \([i, j]\) 这段区间的操作最大值最小是多少, 转移考虑枚举中间点和两端
但这样还是太慢了, 我们换一个思路. 进行二分答案, 将上述 \(\rm{DP}\) 转为可行性 \(\rm{DP}\), 复杂度为 \(\mathcal{O}(n^3 \log n)\), 考虑如何优化.
在上述转移中, 有一句 \(\displaystyle \min_{k = i}^{j - 1}(\max(f_{i, k}, f_{k + 1, j}))\), 转化为可行性 \(\rm{DP}\) 的话就是 \(f_{i, j} \stackrel{\text{or}}{\gets} f_{i, k} \text{ and } f_{k + 1, j}\), 我们换一个角度看待这个事情: 如果 \([i, j]\) 可行, 我们让 \(f_{i, *}\) 或上 \(f_{j + 1, *}\) 的值, 代表如果 \(f_{i, j}\) 和 \(f_{j + 1, k}\) 均可行, 那么 \(f_{i, k}\) 也一定可行, 采用 bitset 优化, 复杂度 \(\displaystyle \mathcal{O}(\frac{n^3}{\omega} \log n)\). 枚举顺序的话 \(i\) 倒序枚举, \(j\) 正序枚举即可.

浙公网安备 33010602011771号