排卡

超喜欢这题,题意简洁,给我写爽了。

注意题目中的两种操作:

  1. \(b_i\)\(a\) 的队列头,并在 \(a\) 的头部弹出一个元素。
  2. \(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]\),接下来弹出的要么是此时的队头、要么队尾。于是再次分讨:
    1. 接下来弹出的是此时的队头,此时分数计算中的 \(b_{i+1}=a_{l+1}\)
    2. 接下来弹出的是此时的队尾,此时分数计算中的 \(b_{i+1}=a_{r}\)
  • 接下来弹出的是队尾元素,此时分数计算中的 \(b_i=a_r\)。区间只剩下 \([l,r-1]\),接下来弹出的要么是此时的队头、要么队尾。于是再次分讨:
    1. 接下来弹出的是此时的队头,此时分数计算中的 \(b_{i+1}=a_{l}\)
    2. 接下来弹出的是此时的队尾,此时分数计算中的 \(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}}) \]

posted @ 2025-08-15 21:29  swate  阅读(16)  评论(0)    收藏  举报
body{ cursor: url(https://files.cnblogs.com/files/wkfvawl/cursor.ico),auto; }