LG4007 小 Y 和恐怖的奴隶主 题解
Tag
动态规划,矩阵加速 dp。
Preface
碎碎念:校内模拟赛考到了这道题,本来已经无限接近正解了,然后死在了不会打代码,果然还是实力不够啊……
Description
这有一个大 boss,初始他有一个小怪,这个小怪的血量为 \(m\),如果这个小怪收到了伤害但是没有死就会产生一个新的小怪,血量同样为 \(m\),同一时刻小怪的数量最多不超过 \(k\)。一共进攻 \(n\) 轮,每一轮可以攻击小怪也可以攻击 boss,攻击他们的概率是等价的。
求最后 boss 收到的伤害的期望。
\(\texttt{data range:} n\leq 10^{18},m \leq 3, k \leq 8\).
Solution
看到 \(n\) 的范围较大但是 \(m,k\) 的范围较小,很容易想到矩阵优化 dp。
一个比较显然的想法就是用一个四维变量 \(f_{i,a,b,c}\) 表示第 \(i\) 轮有 \(a\) 个满血,\(b\) 个残血和 \(c\) 个风中残烛。
可以从 \(f_{i,a,b,c}\) 到 \(f_{i+1,a,b+1,c},f_{i+1,a+1,b-1,c+1},f_{i+1,a,b,c-1},f_{i+1,a,b,c}\) 这几种情况,分别讨论一下即可,注意边界情况。
然后用一个 \(g\) 数组来记录期望就可以了,时间复杂度为 \(O(Tn\dbinom{m+k}m)\)。
不难发现我们的状态不会超过:\(\dbinom {m+k}{m}\) 个,这个数值算出来最大是 \(165\) 的样子,之后用 \(B\) 来代替 \(\dbinom{m + k} m\)。
我们就可以设计一个 \(166 \times 166\) 的矩阵来优化我们的 dp。
最后时间复杂度为 \(O(TB^3\log n)\),显然过不去。
发现我们需要的 \(g\) 数组实际上是一个一维的向量,可以用预处理加上向量乘矩阵的运算来将快速幂的复杂度优化到 \(O(B^3\log n)-O(B^2\log n)\),这个做法在 luogu 上面是可以通过的。
时间复杂度正确了,但是还是过不去,因为会被一个 \(n=(111111\cdots)_2\) 的数据给卡爆,就到了经典卡常数环节了。
我的代码没有卡常数,而且是蒯的别人的代码,这里是 Loj 的提交记录,希望可以给予一定的参考。
Code
在上面啦。