14 Sep 2020 1016字 4分 11次 dp
如果这篇博客帮助到你,可以请我喝一杯咖啡~
CC BY-NC-SA 4.0 (除特别声明或转载文章外) 考虑 dp。
状态转移方程
我们定义 fi,j 为走到第 i 层,共走了 j 次的方案数,容易得到转移方程:
fi,j=k=down∑upfk,j−1 [k=i]其中 down 为能走到 i 层的下界,up 为上界。
时间复杂度 O(n2k),显然无法 A 掉此题。这时,有经验的 OIer 就会发现,这是可以用前缀和优化的。我们设 si,j=k=1∑ifk,j,得到新的转移方程:
fi,j=sup,j−1−sdown−1,j−1−fi,j−1时间复杂度 O(nk),可以 AC。
一些细节
显然,由于 ∣x−y∣<∣x−b∣ 的限制,你只能在 b 的一侧运动,那么,我们可以将 b 层当做 0 层。
这样,我们就可以快速的求出 up 和 down 了,up=n,down=⌊2i⌋+1。
初始化:fa,0=1
我们注意到,j 次的方案数只依赖于 j−1 次,所以我们可以采用滚动数组对空间进行优化。
代码