【题解】 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)\),足以通过本题。