python - Cohesity 的入围测试中提出的与布尔矩阵相关的竞争性编程问题
问题描述
给出了一个宽度为 w 和高度为 h 的 0-1 矩阵。0 表示黑色,1 表示白色。把它想象成条形码。如果整列都用 1 填充,则它是条码上的白色条带。如果 n 个连续的列用 0 填充,那么它将表示一个宽度为 n 的黑色条带。现在矩阵并不完美(有些列不是完全白色或完全黑色,即它们有一些不规则性)。
将单个 0 与 1 切换的成本是 1,反之亦然。
给定 x 和 y,其中 x 是条码中条带必须具有的最小宽度,y 是最大宽度。您必须找到将原始不完美矩阵转换为满足 x 和 y 约束的有效条形码矩阵所需的最小成本,即每个条带的宽度在 [x,y] 之间。
蛮力回溯不起作用,得到 TLE。
解决方案
考虑一列可能是 (1) b
,黑条中最右边的黑色列,和 (2) w
,白条中最右边的白色列之一。让我们使用预先计算的列前缀和C
来计算将一系列列及时转换为白色或黑色的函数。当该列的类型为 时,O(1)
让我们f(i, type)
表示直到第 th 列的条形码的最小成本。然后:i
type
f(0, b) ->
Infinity if x > 1 else C(0, 0, b)
f(0, w) ->
Infinity if x > 1 else C(0, 0, w)
f(i, b) ->
min( C(j, i, b) + f(j - 1, w) )
f(i, w) ->
min( C(j, i, w) + f(j - 1, b) )
for j = (i - y + 1) to (i - x + 1)
(显然小于零f(i)
是无效的,跨越第一个索引左侧的范围的成本也是如此。)i
推荐阅读
- node.js - 摩卡测试忽略错误
- angular - Angular 4:等待http请求结束以初始化表单
- arrays - 使用 Django 过滤 ArrayIngerField
- c# - 从asp.net MVC中的url捕获参数
- angular - Html2pdf(html2canvas + jsPdf):如何设置与文本不同边距的标题?
- angular - 创建自己异步的自定义管道
- bash - Bash - 这里的字符串在提供参数后退出
- node.js - 如何在express nodejs bootstrap中将带有html标签的文本转换为DOM
- javascript - 如何创建使用按钮执行 shell 脚本的 Web 应用程序
- c++ - 这个链表遍历有什么问题?