20201007
T1
T2
T3
首先对于没有修改的情况,有一个显然的dp转移:
if(!last[i]) dp[i] = dp[i - 1] * 2 + 1;
if(last[i]) dp[i] = dp[i - 1] * 2 - dp[last[i] - 1];
其中 dp[i]表示考虑前i位的方案数,last[i]表示最近的与a[i]相同的字符的位置,如果 a[i]第一次出现,则last[i]为0.
现在我们考虑矩阵。
设状态矩阵\(A\),其中A[i][j]表示以i开头,在结尾预支一个j的方案数,其中i,j为0时表示一个时空序列。
对于一个数1的初始矩阵,对于对角线的元素,显然方案数为1,而对于第\(1\)行,显然都为1。
比如对于数字1的初始矩阵为 \(\begin{bmatrix}
1\ 0\ 0\ 0\\
1\ 1\ 1\ 1\\
0\ 0\ 1\ 0\\
0\ 0\ 0\ 1\\
\end{bmatrix}\)
容易发现两个状态矩阵的合并就是矩阵乘法,即\(C_{i,j}=\sum\limits_{k=0}^3A_{i,k}\times B_{k,j}\)
浙公网安备 33010602011771号