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,j0时表示一个时空序列。

对于一个数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}\)

T4

posted on 2020-10-07 14:50  fishsit  阅读(68)  评论(0编辑  收藏  举报

导航