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}\)