1 题目大意
1.1 题目翻译
有两个人轮流取物品。总共有 \(n\) 个物品,第 \(i\) 个物品的价值为 \(w_i\)。
他们按照下面的其中一种方式取物品:
-
取出这一排物品最前面的或者最后面的。这一步没有代价。
-
设还剩下 \(m\) 个物品,那么重复取出 \(\min(B, m)\) 个物品,每次取出最前面的或者最后面的。这一步的代价为 \(A\)。
-
设还剩下 \(m\) 个物品,那么重复取出 \(\min(D, m)\) 个物品,每次取出最前面的或者最后面的。这一步的代价为 \(B\)。
最后一个人取出物品的价值为所有他取出物品价值之和减去他所花费的代价。问当两人均以最优策略取物品时,先手取出物品的价值减去后手取出物品的价值为多少。
1.2 数据范围
对于 \(100\%\) 的数据:
-
\(1 \leq B, D \leq n \leq 3000\)
-
\(A, C \leq 10 ^ 9\)
2 解法分析
2.1 初见此题
首先,一看这道题,我们就会发现:不管怎么取物品,任何时刻的序列一定是原序列的一段连续子区间。所以,我们不难想到区间 DP。
2.2 暴力 DP
设 \(f_{i, j}\) 表示当前序列为原序列从第 \(i\) 个到第 \(j\) 个元素时,答案的最大值。那么,会有 \(3\) 种情况:
-
操作 1。此时,\(f_{i,j} = \max(w_i - f_{i + 1, j}, w_j - f_{i, j - 1})\)
-
操作 2。设 \(l = j - i + 1\),则:
- 当 \(B \geq l\) 时:
\[f_{i, j} = (\sum_{i \leq k \leq j}w_k) - A \]- 当 \(B < l\) 时:
\[f_{i, j} = \max_{0 \leq k \leq l}\{(\sum_{i \leq p \leq i + k - 1} w_p) + (\sum_{j - B + k + 1 \leq p \leq j}w_p) - C - f_{i + k, j - B + k}\} \] -
操作 3。大致与操作 2 相同,这里就不过多叙述。
至此,我们完成了暴力 DP,时间复杂度为 \(\mathcal{O}(n^3)\),显然过不了。
所以,接下来,我们就要考虑优化。
2.3 DP 优化
观察 DP 方程。我们发现,极限复杂度只出现在了操作 2 当 \(B < l\) 的情况。所以,我们把这个式子的 \(\max\) 去掉,得:
我们发现,\((\sum_{i \leq p \leq i + k - 1} w_p) + (\sum_{j - B + k + 1 \leq p \leq j}w_p)\) 可以前缀和 \(\mathcal{O}(1)\) 计算。设 \(s_{l, r}\) 为 \(l\) 到 \(r\) 的物品价值之和,于是得:
观察这个方程。我们把 \(k\) 视为未知数,\(i, j\) 视为常数,则 \(s_{i,j} - C\) 为常数,可以提到 \(\max\) 外面。所以,我们需要维护的只有:
发现这两个区间的长度都是 \((j - B + k) - (i + k) = j - i - B\),那么相当于只需要维护长度为 \(x\) 的 \(f_{i, i + x - 1} + s_{i, i + x - 1}\) 中最小的一个即可。
这有许多维护方法,比如优先队列,线段树,ST 表。
至此,这道题就完成了。时间复杂度为 \(\mathcal{O}(n^2)\) 或者 \(\mathcal{O}(n^2\log{n})\)