20211020 航行(未完成)
作者:互联网
怎么也没想到我会来做期望的题,还想写题解。。
其实就是把别人的题解用我自己也能看懂的语言抄一遍
Description
一条线有 n 个点,初始速度为 0 ,假设向右为正速度,对于每个点 i ,有 \(\frac{p_i}{100}\) 的几率刮西风,速度加一,反之刮东风,速度减一,如果每次变完速度为 v ,此时从当前点 u 转移到 u + v ,当坐标不在 [1, n] 的时候就立即停止。
求从 [1, n] 的每个点作为起始点,求期望走的次数,走不出去的话输出 -1 。
Analysis
啊啊啊,看到这种题就很烦,但还是要做呀。。
老思路,想一想一共会有哪些状态,对于每个点,速度能从 0 到 n ,在大也不可能了,不然速度为 n 的时候早就一下走出去了。
那么先标记好: \(f_{i, j}\) 表示在第 i 个点,速度为 j 时作为起始状态,期望走的次数。
Solution
Part1( O(n^6) )
继续接着老思路走,我们要想对于每个状态,有哪些其他状态可以到达。
其实应该很显然,分成刮西风和刮东风两种情况。
那么对于任意一个 \(f_{i, j}\) ,我们就能确定两个速度,那么从左右两边过来的话,每个速度对应两个点,一共就能至多从四个状态转移过来。
假如走出去了怎么办,不管他,但是要标记这个点这个速度能够走出去,否则根本算不了,这个后面说。
那么这样的话我们就得到了 n^2 个关系。
然后就很自然的想到了高消,那么对于每次从每个点出发,\(f_{i, 0}\) 概率为 1 ,解 n 次方程,总共是 \(O(n^7)\) 的。
前两天的考试里面有一道题就出现了类似的情况,要解 n 次方程,但观察整个高消的过程,如果只是常熟的改变,并不影响高消顺序,所以可以把整个 n 组常熟压到一起解。
所以时间复杂度就是 \(O(n^6)\) 了。
到这里,其实思路都是很自然的顺下来,目前还没有新思路,那先来补坑,怎么判 -1 。
想到如果是 -1 ,一定就是指没有一个能到达的状态能走出去,又因为概率问题,所以每个状态必然能到达至少一个至多两个其他的状态。
所以这就肯定是围成了一个环,当然不止着一种情况,如果没有答案,还有可能是一个环能够走向一个“死环”(就指没有出边的环)。
(心里话:一开始我在想,为什么是能够而不是只能,后来我发现,每个关系指向的状态都会对出发状态产生贡献。如果贡献算不了,是 -1 ,那么这里的贡献就缺失了,自然也算不了出发状态的贡献了。)
这样看的话,我们就可以缩点,然后拓扑序排掉 -1 的状态,剩下的就可以继续算了。
Part2( O(n^{4.5}) )
虽说速度我们开到了 n ,但是每次走的话,速度至多减一,其实只要最后到边界的时候,速度为 1 ,就能走出去。
这就相当于对于一个速度,速度每次减一,到边界的时候速度为一,一共至少走了 n 步就行(注意不是 n 次。。),那么这个上限能算,就是 \(\sqrt{2n}\) 。
于是状态数就减少到 O(n^{1.5}) ,时间复杂度就来到了 O(n^{4.5}) , -1 的情况同上。
Part3( O(n^3) )
其实所有式子合在一起看上去非常“不错”,因为几乎全是 0 ,即便是 Part2 无用状态太多,但又不能去掉,非常的烦。
那么我们是不是能做到只保留 n 个式子呢??
那要看我们怎么把一些用处不大但又必须要有的状态提前合并到一块了。
最直接的想法就是只保留 \(f_{i, 0}\) ,那么这样的话,本身我们只确定每个状态与其他状态的直接贡献,我们要转换到确定每个状态到所有状态的贡献,无论是直接的,还是间接的。
形象地理解,就是我们知道一张图所有边的样子,现在我们要变成要知道整张图的样子。
标签:状态,那么,每个,20211020,贡献,航行,完成,速度,我们 来源: https://www.cnblogs.com/Illusory-dimes/p/15435499.html