一、题目
点此看题
二、解法
我们可以做一下问题的转化,求出正好等于
k的就等价于求出
≤k 减去
<k 的情况。
0x01 预处理
有一个根本想不到 的
dp,由于每一个格子安全或者不安全的概率是一样的,所以位置就没有这么重要了,我们定义
dp[i][j]为最大矩阵大小为
i×(j−1),并且在
j处被截断了,我们可以写出如下转移:
{dp[i][j]=0dp[i][j]=∑t=1i(∑p=j+1∞dp[t−1][p])×(∑p=j∞dp[i−t][p])i×j>kotherwise解释一下为什么第一个柿子要从
i+1开始枚举,因为同一行可能有多个叉,所以我们只能然后面的去统计前面的方案。显然上式可以用后缀和优化,我们设
dps[i][j]=∑p=1∞dp[i][p],柿子就可以写成这样:
dp[i][j]=t=1∑idps[t−1][j+1]×dps[i−t][j]真正有用的状态数只有
klogk个(考虑
k+2k+.....的大小),转移复杂度
O(k),处理出
dp数组总共的复杂度是
O(k2logk)。
0x02 海岸线
得到
dp数组以后,海岸线就好处理多了,我们定义
f[i] 为处理到了
i处,在
i处安放障碍的概率,则转移为:
f[i]=j=1∑kf[i−j−1]×dps[j][2]上式显然能用矩阵快速幂解决,时间复杂度
O(k3logn)。
上式是一个常系数齐次线性递推,直接套板子,可以优化到
O(k2logn)。
咕咕咕