矩阵快速幂优化的dp

如果你已经推导出了转移方程
dp[i][j]=dp[i1][fit[j]]dp[i][j]=\sum dp[i-1][fit[j]]
那么你可以把这个式子表示为如下的矩阵形式:
[010101010][dp[i1][0]dp[i1][1]dp[i1][2]]=[dp[i][0]dp[i][1]dp[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]
左边第一个矩阵设为T,T[i][j]为1,表示i与j是fit的。为0则不fit。
设等式右边那块是fn,则这个式子可以表示为Tfn1=fnT*f_{n-1}=f_n,推下去就得到Tn1f1=fnT^{n-1}*f_1=f_n。把Tn1T^{n-1}用矩阵快速幂解出来,与f1f_1相乘就得到fnf_n了。
与笨拙的循环dp相比,速度之快令人咋舌。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章