如果你已经推导出了转移方程
d
p
[
i
]
[
j
]
=
∑
d
p
[
i
−
1
]
[
f
i
t
[
j
]
]
dp[i][j]=\sum dp[i-1][fit[j]]
dp[i][j]=∑dp[i−1][fit[j]]
那么你可以把这个式子表示为如下的矩阵形式:
[
0
1
0
1
0
1
0
1
0
]
∗
[
d
p
[
i
−
1
]
[
0
]
d
p
[
i
−
1
]
[
1
]
d
p
[
i
−
1
]
[
2
]
]
=
[
d
p
[
i
]
[
0
]
d
p
[
i
]
[
1
]
d
p
[
i
]
[
2
]
]
\left[ \begin{matrix} 0&1&0\\ 1&0&1\\ 0&1&0 \end{matrix} \right] *\left[ \begin{matrix} dp[i-1][0]\\ dp[i-1][1]\\ dp[i-1][2] \end{matrix} \right]= \left[ \begin{matrix} dp[i][0]\\ dp[i][1]\\ dp[i][2] \end{matrix} \right]
⎣⎡010101010⎦⎤∗⎣⎡dp[i−1][0]dp[i−1][1]dp[i−1][2]⎦⎤=⎣⎡dp[i][0]dp[i][1]dp[i][2]⎦⎤
左边第一个矩阵设为T,T[i][j]为1,表示i与j是fit的。为0则不fit。
设等式右边那块是fn,则这个式子可以表示为
T
∗
f
n
−
1
=
f
n
T*f_{n-1}=f_n
T∗fn−1=fn,推下去就得到
T
n
−
1
∗
f
1
=
f
n
T^{n-1}*f_1=f_n
Tn−1∗f1=fn。把
T
n
−
1
T^{n-1}
Tn−1用矩阵快速幂解出来,与
f
1
f_1
f1相乘就得到
f
n
f_n
fn了。
与笨拙的循环dp相比,速度之快令人咋舌。
矩阵快速幂优化的dp
最新推荐文章于 2021-03-25 22:45:05 发布