排卡
超喜欢这题,题意简洁,给我写爽了。
注意题目中的两种操作:
- 令 \(b_i\) 为 \(a\) 的队列头,并在 \(a\) 的头部弹出一个元素。
- 令 \(b_i\) 为 \(a\) 的队列尾,并在 \(a\) 的尾部弹出一个元素。
由于双端队列需要控制两端的位置,所以显然要使用区间 dp。简化一下分数计算:
\[\sum_{i = 1}^{n - 1} \mathrm{score}(b_i, b_{i + 1})=\sum_{i = 1}^{n - 1} \mathrm{score}(b_i^{b_{i + 1}} \bmod 998244353)
\]
我们不妨设 \(dp_{l,r,k}\) 来表示从状态 \(l\) 是由第 \(k\) 种状态转移到状态 \(r\) 的。其中 \(k \in [0,1]\),分别表示从队头弹出、从队尾弹出。
状态如何转移呢?很简单,分类讨论:
- 接下来弹出的是队头元素,此时分数计算中的 \(b_i=a_l\)。区间只剩下 \([l+1,r]\),接下来弹出的要么是此时的队头、要么队尾。于是再次分讨:
- 接下来弹出的是此时的队头,此时分数计算中的 \(b_{i+1}=a_{l+1}\)。
- 接下来弹出的是此时的队尾,此时分数计算中的 \(b_{i+1}=a_{r}\)。
- 接下来弹出的是队尾元素,此时分数计算中的 \(b_i=a_r\)。区间只剩下 \([l,r-1]\),接下来弹出的要么是此时的队头、要么队尾。于是再次分讨:
- 接下来弹出的是此时的队头,此时分数计算中的 \(b_{i+1}=a_{l}\)。
- 接下来弹出的是此时的队尾,此时分数计算中的 \(b_{i+1}=a_{r-1}\)。
那么状态转移方程可以推出来了:
\[dp_{l,r,0} = \max(dp_{l + 1,r,0} + a_l^{a_{l + 1}}, dp_{l + 1,r,1} + a_l^{a_r})
\]
\[dp_{l,r,1} = \max(dp_{l,r-1,0} + a_r^{a_{l}}, dp_{l,r-1,1} + a_r^{a_{r-1}})
\]

浙公网安备 33010602011771号