题解:P15567 [COCI 20252026 5] 五步 Pet
题解:P15567 [COCI 2025/2026 #5] 五步 / Pet
思路
我们发现一共经过 $5$ 片荷叶等同于跳 $4$ 次。
而如果每次都不是原地跳的话,只有跳出一个矩形才会造成第 $5$ 片和第 $1$ 片是同一片。
但是我们很难限制在中途不形成矩形,否则会产生很多种状态,所以考虑正难则反。
首先忽略不形成矩形的条件。
那么可以很容易地得出一个状态:$f_{x,y,i,0/1}$ 表示现在在 $(x,y)$,一共跳了 $i$ 次,上次跳了 $0/1$ 的方向(分别代表同一列和同一行)。
转移也不是很难想,$f_{x,y,i,0}=\sum_{j=1}^{m}f_{x,j,i-1,1}-f_{x,y,i-1,1}$,同理可得 $f_{x,y,i,1}=\sum_{j=1}^{n}f_{j,y,i-1,0}-f_{x,y,i-1,0}$。
对式子进行分析,首先若此次的转移方向是同一列,则是要从所有同一列的少跳一步且上一次是同一行的状态转移而来,并且由于不能原地跳,所以还要再减掉由自己转移而来的状态。
但是这个时间复杂度无法接受,那么先提前对每一行和每一列的值做加和预处理,就可以做到 $O(nm)$ 做完整个 DP。
此时我们就得到了有可能在最后一跳返回起点的情况,考虑如何剔除掉非法情况。
发现只需要找出所有矩形,因为可以从每个顶点分别出发,又可以选择是顺时针还是逆时针,所以将矩形数量 $\times8$ 就是多余的状态。
矩形咋找呢,我们用 bitset 维护每一列的情况,将两列按位与起来,$1$ 的数量就是这两列存在相同 $y$ 值的个数。
时间复杂度 $O(\frac{n^2m}{w})$,由于 $n,m$ 均只有 $2000$,还是可以接受的。
此时已经拿到了 93pts,最后一个 subtask 会空间超限。
考虑滚动数组优化 DP,空间也可以通过。
然后状态数组,加和,统计答案会爆 long long,均要开 __int128,注意中间值的处理,都开 __int128。
代码
1 |
|