刚刚 A 了这道题,作为蒟蒻的我来写一篇题解加深一下印象。首先,题目意思是给你一个字符串和一个序列 \(a\),问最大的美丽值。美丽值是由一段一段的价值累计得到的,而这个价值定义为:
\[w(l,r)=
\begin{cases}
a_r-a_l, & S_{l\dots r} \text{为合法括号序列}\\
\ 0 & \text{otherwise}\\
\end{cases}\]
定义:
\[dp_i=\max_{1≤j≤k,1≤pos_j<i}\{w(1,pos_1)+w(pos_1+1,pos_2)+\dots +w(pos_k+1,i)\}
\]
那么 \(dp_i\) 应该从前面的地方 \(j\) 转移过来(并且是最大的美丽值的地方),
\[dp_i=\max\{dp_j+w(j+1,i)\}
\]
那么这又可以分为两种情况
\[dp_i=
\begin{cases}
\max\{dp_j+a_i-a_{j+1}\} &S_{j+1\dots i} \text{为合法括号序列}\\
\max\{dp_j\} & \text{otherwise}
\end{cases}\]
同时又注意到 \(dp_i\) 的值应该是单调不减的,所以我们的\(\max\{dp_j\}=dp_{i-1}\),又可以改为 \(dp_i=dp_{i-1}\)。综上,我们的方程为
\[dp_i=
\begin{cases}
\max\{dp_j+a_i-a_{j+1}\} &S_{j+1\dots i} \text{为合法括号序列}\\
dp_{i-1} & \text{otherwise}
\end{cases}\]
但是这样子做的话,时间复杂度为 \(O(n^2)\),妥妥的超时,现在考虑优化。注意到方程中 \(dp_j+a_j-a_{j+1}\),\(a_i\) 对于计算 \(dp_i\) 而言是一个常量,可以提取出来,于是又变成了
\[dp_i=\max\{dp_j-a_{j+1}\}+a_i
\]
现在我们令
\[c_i=\max\{dp_j-a_{j+1}\}
\]
那么我们的方程又可以转化为
\[dp_i=
\begin{cases}
c_i+a_i &S_{j+\dots i} \text{为合法括号序列}\\
dp_{i-1} & \text{otherwise}\\
\end{cases}\]
这个的时间复杂度为 \(O(n)\),绰绰有余。那么现在的问题又转移到了求解\(c_i\)。考虑到
\[c_i=\max\{dp_i-a_i\}
\]
我们记 \(pre_i\) 表示
\[\max_{j<i,S_{j\dots i}\text{为合法括号序列}}^{}\{j\}
\]
那么
\[c_i=
\begin{cases}
\max(c_{pre_i-1},dp_{pre_i-1}-a_{pre_i}) &pre_i >0\\
-∞ &pre_i=0\\
\end{cases}
\]
这个处理也是 \(O(n)\) 的,也就是我们可以 \(O(n)\) 完成转移了。至于处理 \(pre_i\) 的方法考虑使用栈,具体见代码。
Ac Code
浙公网安备 33010602011771号