题目翻译

有一个 $H\times W$ 的矩阵,切若干次,使得每一块中 $1$ 个数 $\leq k$,只能一切到底,问最少用几刀。

题目思路

直接暴力枚举每一行每一列绝对不行,复杂度 $\mathcal O(2^{H+W})$。

我们发现 $H$ 很小,我们可以枚举 $H$ 在哪里切割,复杂度 $\mathcal O(2^H)$。其实最多只有 $H-1$ 刀,为了方便描述,统一用 $H$。

接着,我们对于 $W$ 考虑贪心,每一块有尽量多的 $1$,最后肯定花费最小,也是可以证明的。

综上所述,我们枚举 $2^H$ 种方案,接着扫一遍 $W$ 确定切割次数。

时间复杂度 $\mathcal O(2^H\times W\times H)$,可以通过此题。

但是还不完美,如果 $H\leq 15,W\leq 10^6$,明显是会炸掉的。

我们扫 $W$ 时,这里 $1$ 个数肯定是单调不增的,可以考虑进行二分或者倍增来找。这一段的时间复杂度一下子变成了 $\mathcal O(\log W)$,总时间复杂度 $\mathcal O(2^H\times \log W\times H)$。

但上述做法在面对全是 $1$ 时,每次只能前进一步,实际上会退化成 $\mathcal O(W)$。其余数据效果比最初做法时间上较佳。

完整代码

代码很长,不贴了,发个链接。

Code 1

Code 2

最后修改:2023 年 04 月 22 日
v我50吃疯狂星期四