据说原题是个集训队作业题。
这题主要侧重于 DP 的优化。
首先考虑设 f(t,l,r) 表示考虑前 t 层,前 t 层都连通且第 t 层剩下的方块为 (l,r] 内的。
(之所以左开右闭是因为式子比较整齐)
那么有个显然的转移 f(t,l,r)=pl⋅pm−r∑(l,r]⋂(i,j]≠∅f(t−1,i,j)
其中 pi 表示同一行上 k 次台风刚好摧毁 i 个连续方块的概率。
有 pi=(ki)pi(1−p)k−i
然而这时会发现状态空间开不下而且转移更吃力……
考虑再设 fL(t,l)=∑l<rf(t,l,r)fR(t,r)=∑l<rf(t,l,r)sL(t,l)=∑l≤afL(t,a)sR(t,r)=∑a≤rfR(t,a)
那么 f(t,l,r) 就应该是 pl⋅pm−r[sR(t−1,m)−sR(t−1,l)−sL(t−1,r)]。
当然这时就应该舍弃一开始的 f 了,而是以 fL,fR,sL,sR 为状态。
两边的处理是类似的,这里以 fR 为例: fR(t,r)=∑l<rpl⋅pm−r[sR(t−1,m)−sR(t−1,l)−sL(t−1,r)]=pm−r⋅sR(t−1,m)∑l<rpl−pm−r∑l<rpl⋅sR(t−1,l)−pm−r⋅sL(t−1,r)∑l<rpl
然后就会发现,维护 pi 的前缀和是不够的,还要维护 pi⋅sR(t−1,i) 的前缀和。
这样就可以做到 O(nm) 了。
代码:
1 |
|