不讲,代码。
挨个判断每一位需要做多少次即可,O(∣S∣)。
代码。
题目已经给你判断相同图的方法了,注意到 n≤8 所以直接阶乘枚举编号即可,O(n2⋅n!)。
代码。
典型的标数法。
设 f[i][j] 表示从 (1,1) 走到 (i,j) 中经过的最多的空方块个数。若无法走到则 f[i][j] 设为 −1。
初始化:处理出第一行和第一列,如果当前格为障碍,则其再往右或往下均为 −1。
状态转移:
如果 f[i−1][j] 和 f[i][j−1] 均为 −1 或者 (i,j) 本身就是障碍,则 f[i][j] 也应设为 −1。
否则,取 f[i−1][j] 和 f[i][j−1] 中的那个不是 −1 的转移,不妨设 f[i−1][j]=−1,则 f[i][j]=f[i−1][j]+1。
时间复杂度:O(nm)。
代码。
假设一矩阵 Mk 表示車从 (x1,y1) 出发后移动 k 步后到每一个格子的方法种数。
易知:
M0=⎣⎢⎢⎢⎢⎢⎢⎢⎡0⋮0⋮0⋯⋮⋯1⋯⋮⋯0⋮0⋮0⎦⎥⎥⎥⎥⎥⎥⎥⎤
且 Mk 中的 (i,j) 上的数即为 Mk−1 中第 i 行 与第 j 列上所有数的和(不算 (i,j))。
可以发现一个事实:对于任意 Mk,第 x1 行上的数(不算 (i,j)) 全部相同,第 y1 列上的数(不算 (i,j)) 全部相同,其余所有的数也全部相同。
那么可以设:
Mk=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡dd⋮cd⋮ddd⋮cd⋮d⋯b⋯b⋯⋮⋯a⋯b⋯⋮⋯b⋯d⋯d⋯⋮⋯c⋯d⋯⋮⋯d⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
则可得出递推式子:
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧a=(n−1)b0+(m−1)c0b=a0+(n−2)b0+(m−1)d0c=a0+(m−2)c0+(n−1)d0d=b0+c0+(n+m−4)d0
复杂度 O(k),可以过,代码。
优化
这个式子显然可以矩阵递推。
设 Ak=[a,b,c,d]。
Ak=Ak−1∗⎣⎢⎢⎢⎡0110n−1n−201m−10m−210m−1n−1n+m−4⎦⎥⎥⎥⎤
那么就可以 O(logk) 了。