ABC232 部分题目题解

  • A

不讲,代码

  • B

挨个判断每一位需要做多少次即可,O(S)O(|S|)

代码

  • C

题目已经给你判断相同图的方法了,注意到 n8n\leq 8 所以直接阶乘枚举编号即可,O(n2n!)O(n^2\cdot n!)

代码

  • D

典型的标数法。

f[i][j]f[i][j] 表示从 (1,1)(1,1) 走到 (i,j)(i,j) 中经过的最多的空方块个数。若无法走到则 f[i][j]f[i][j] 设为 1-1

初始化:处理出第一行和第一列,如果当前格为障碍,则其再往右或往下均为 1-1

状态转移:
如果 f[i1][j]f[i-1][j]f[i][j1]f[i][j-1] 均为 1-1 或者 (i,j)(i,j) 本身就是障碍,则 f[i][j]f[i][j] 也应设为 1-1

否则,取 f[i1][j]f[i-1][j]f[i][j1]f[i][j-1] 中的那个不是 1-1 的转移,不妨设 f[i1][j]1f[i-1][j] \neq -1,则 f[i][j]=f[i1][j]+1f[i][j] = f[i-1][j] +1

时间复杂度:O(nm)O(nm)

代码

  • E

假设一矩阵 MkM_k 表示車从 (x1,y1)(x1,y1) 出发后移动 kk 步后到每一个格子的方法种数。

易知:

M0=[0001000]M_0= \begin{bmatrix} 0 & \cdots & 0\\ \vdots& \vdots & \vdots\\ 0&\cdots 1\cdots &0\\ \vdots& \vdots & \vdots\\ 0&\cdots & 0\\ \end{bmatrix}

MkM_k 中的 (i,j)(i,j) 上的数即为 Mk1M_{k-1} 中第 ii 行 与第 jj 列上所有数的和(不算 (i,j)(i,j))。

可以发现一个事实:对于任意 MkM_k,第 x1x1 行上的数(不算 (i,j)(i,j)) 全部相同,第 y1y1 列上的数(不算 (i,j)(i,j)) 全部相同,其余所有的数也全部相同。

那么可以设:

Mk=[ddbdddbdccacddbdddbd]M_k= \begin{bmatrix} d & d& \cdots b& \cdots d&\\ d & d& \cdots b& \cdots d&\\ \vdots& \vdots& \cdots \vdots&\cdots\vdots& \\ c & c& \cdots a& \cdots c&\\ d & d& \cdots b& \cdots d&\\ \vdots& \vdots& \cdots \vdots& \cdots\vdots& \\ d & d& \cdots b& \cdots d&\\ \end{bmatrix}

则可得出递推式子:

{a=(n1)b0+(m1)c0b=a0+(n2)b0+(m1)d0c=a0+(m2)c0+(n1)d0d=b0+c0+(n+m4)d0\begin{cases} a=(n-1)b_0+(m-1)c_0\\ b=a_0+(n-2)b_0+(m-1)d_0\\ c=a_0+(m-2)c_0+(n-1)d_0\\ d=b_0+c_0+(n+m-4)d_0 \end{cases}

复杂度 O(k)O(k),可以过,代码

优化

这个式子显然可以矩阵递推。

Ak=[a,b,c,d]A_k=\begin{bmatrix}a,b,c,d\end{bmatrix}

Ak=Ak1[0n1m101n20m110m2n1011n+m4]A_k=A_{k-1}* \begin{bmatrix} 0&n-1&m-1&0\\ 1&n-2&0&m-1\\ 1&0&m-2&n-1\\ 0&1&1&n+m-4 \end{bmatrix}

那么就可以 O(logk)O(\log k) 了。


ABC232 部分题目题解
https://sobaliuziao.github.io/2021/12/25/post/f56ceb3f.html
作者
Egg_laying_master
发布于
2021年12月25日
许可协议