【题解】 codeforeces CF222E Decoding Genome

可以先考虑裸的dp方程:

\(dp_{i,j}\) 表示第 \(i\) 个氨基酸为 \(j\) 时前 \(i\) 个氨基酸的方案数,则 \(dp_{i,j}=\sum_k dp_{i-1,k}\),其中 \(k\) 满足不存在 \(<k,j>\) 这个二元组。

滚掉一维:\(dp_{i}=\sum_j dp_{j}\)

这样复杂度 \(O(nm)\),无法通过此题。

发现我们其实可以开一个数组 \(a\),若 \(a_{i,j}=1\) 表示 \(i\) 后面可以跟 \(j\),那原dp方程可化为:\(dp_i=\sum_{j=1}^m dp_j\times a_{j,i}\)

这样可能还不够明显,我们这么写:\(dp_{k,i}=\sum_{j=1}^m dp_{k,j}\times a_{j,i}\),其中 \(k=1\)

这很显然是一个矩乘的形式,于是最终的dp数组就是 \(A\times a^{n-1}\),其中 \(A=\{1,1,1,\dots ,1\}\)

复杂度 \(O(m^3\log n)\),足以通过本题。

posted @ 2022-08-15 21:33  wapmhac  阅读(23)  评论(0编辑  收藏  举报