板板题:
• 给出一张有向图,每个点有得分• 每次经过一个点你就可以获得它的得分(是正数)(多次计算)• 你可以走 ? 步,然后选择其中连续的一段不超过 ? 的时间,将这一段的时间的得分翻倍• 一旦不能走了就必须停止• 求最高得分• ? ≤ 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放在的所有位置。所以这个运算有结合律。就可以快速幂啦~!