【问题标题】:Traversing all the subarrays of a 2-D array遍历二维数组的所有子数组
【发布时间】:2019-03-18 09:54:03
【问题描述】:

我有一个大小为 P*Q 的二维数组,我必须根据该数组回答 K 个问题。给定的二维数组由数字 0 和 1 组成。对于每个问题,我们必须计算没有两个相同元素相邻的任何正方形子数组的最大大小。 例如,如果 P=Q=8 并且我们给定的数组是

00101010
00010101
10101010
01010101
10101010
01010101
10101010
01010101

那么问题 Ki 允许我们做 Ki 翻转次数(0 到 1 或 1 到 0)。

Here K=4(number of questions)
1 2 0 10001
Output: 7 8 6 8

我明白了,对于K1=1,我们可以将数组index(1,1)的值改为1,得到一个7*7大小的有效矩阵,输出为7。如果我们有Ki>=2我们的答案是 8。 我认为我们必须维护一个数组 ans[k] ,它存储有效的方形子矩阵的最大大小。为此,我们可以从原始数组的每个索引开始,并遍历其子数组,如果我们从该索引开始,则计算 Flip=i 的最大大小的值。我们必须对从每个索引开始的子数组执行此操作,然后将它们的最大值存储在 Flip[i] 中。 我在实现这一点时遇到了问题,因为我不知道如何遍历给定索引的所有子数组。我尝试了这么久,但仍然没有实现。有人可以帮忙吗?

【问题讨论】:

  • 使用向量的向量或数组的数组和两个基于范围的循环。或者实现你自己的矩阵类。
  • @Ron 你能解释一下吗?
  • 明确一点,这里的动态规划算法不是的问题,对吧?
  • @Davis 这是问题

标签: c++ arrays loops dynamic-programming sub-array


【解决方案1】:

它有助于将问题简化为仅依赖于单个值(而不是成对的相邻值)。所以XOR网格与每个完美的棋盘

01111111  10000000
10111111  01000000
11111111  00000000
11111111  00000000
11111111  00000000
11111111  00000000
11111111  00000000
11111111  00000000

现在的目标是在任何一个网格中找到不超过K_i个0的最大正方形(这里显然偏向于左侧)。

K_i=0 开始。要找到 1 的最大正方形,请为每个单元格计算 和从它开始的 中 1 的数量(0 表示包含 0) 的单元格;以该单元格作为其左上角的最大 正方形(假设它是 1)比其右邻居的行长的 minimum 大一,即列其下邻居的长度,以及其右下邻居的平方大小。 (对于网格外不存在的单元格,所有这些都是 0。)按 diagonal-major 顺序访问单元格,以便在需要时使用这些值;注意生成的最大正方形。

为了推广到K_i>0,为每个单元格存储每个翻转次数的三个值(行长、列长和正方形大小),直到 K_i。像以前一样,带有 1 的单元格将每行/列的长度加 1,而带有 0 的单元格移动这些长度到下一个翻转计数,丢弃那些翻转计数现在太大了,为 0 次翻转添加 新值 0。对于 row-length-east、column-length-south 和 square-size-southeast 的每个组合,每个组合都有一个翻转计数,一个单元格获得 candidate 正方形大小,这是它们与 sum 他们的翻转计数,如果单元格本身是 0,则 加一。对于每个翻转计数(不是太大),保持最大的正方形大小,注意它是否是迄今为止遇到的最大的(对于该翻转计数)。

请注意,当正方形远小于数组时,蛮力解决方案可能几乎一样快,因为它只需要访问每个数组的次数很少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    相关资源
    最近更新 更多