板板题——预处理+矩阵+定义新运算

板板题:

• 给出一张有向图,每个点有得分
• 每次经过一个点你就可以获得它的得分(是正数)(多次计算)
• 你可以走 𝑚 步,然后选择其中连续的一段不超过 𝑙 的时间,将这
一段的时间的得分翻倍
一旦不能走了就必须停止
• 求最高得分
• 𝑛 ≤ 300, 𝑙 ≤ 𝑚 ≤ 109

题解:

这个l时间挺复杂。如果没有它呢?

首先我们可以dp,f[i][j]表示,在i点,走了j步,最大得分。

不能走了必须停止,那么如果i没有出点,就直接转移到f[i+1][j],也相当于走一个自环。

把自环连上,然后可以矩阵乘法优化。

 

但是这个l非常棘手啊。

首先由于点权都是正数,所以一定l次翻倍最优。

并且,这l步怎么走和之间的收益没有关系,是独立出来的。而且连续。

 

设点数没有翻倍的转移矩阵是A

那么,我们可以处理一个点数翻倍的转移矩阵B

ST*(B^l),中的每个点的值就是从i到j经过l步走到的最大收益。

但是,从哪一步开始走这l步呢?

即,我们要求:$\sum_{i=1}^{m-l-1} A^i*B^l*A^{(m-l-1-i)}$

其中,求和表示按位求最大值,*表示矩阵乘法

设$M=B^l$

那么,我们要求:$\sum_{i=1}^{T} A^i*M*A^{(T-i)}$

直观来讲,就是考虑把i个A放在M左边,T-i个A放在M右边。

直接枚举还是爆炸!

T是1e9的。

能不能设计一个快速幂求出来呢?

但是很显然,直接矩阵乘法无法转移。

所以,看来要定义新运算了。

 

以下开始重点(划重点!)

维护一个数对(L,R),其中,(L0=M,R0=A),0表示0次方,即初始状态。

我们定义:

一个位置可能不够了,所以要定义一个pair(matrix,matrix)

构造思路,能够从$(L,R)^T$中找到答案。

按位取max操作必须能覆盖所有的$AA...MAA...$

而且能用固定的运算得到答案。

而且必须有结合律,以便支持快速幂

于是我们定义:

$(L_i,R_i)\bigodot(L_j,R_j)=(L_i*R_j+R_i*L_j,R_i*R_j)$

其中,$\bigodot$是定义的新乘法符号。*表示矩阵乘法。+表示二者按位取max

那么,我们要求的是:

$(L_k,R_k)=(L_0,R_0)\bigodot(L_0,R_0)\bigodot(L_0,R_0)...$

可以发现,每次的$R_i*R_0$到后面就是$A^{i+1}$

而,我们所关心的$L$

$L_i*R_0$把之前的所有AAM,AMA,MAA后面加了一个A

然后,$R_i*L_0$又得到了AAAM,

其实就已经遍历了AAMA,AMAA,MAAA,AAAM

其实本质就是一个数学归纳法,可以证明:

我们遍历了$\sum_{i=1}^{T} A^i*M*A^{(T-i)}$

按位取max是成立的,因为从不同点出发,可能最优情况下选择的翻倍位置是不同的。

所以新运算是正确的。

因为,我们就是在凑一个$AA...MAA...$

由于我们考虑了把AAAA放在的所有位置。

所以这个运算有结合律。

就可以快速幂啦~!

 

posted @ 2018-10-08 17:35  *Miracle*  阅读(447)  评论(0编辑  收藏  举报