遍历二维数组的所有子数组

Traversing all the subarrays of a 2-D array

本文关键字:数组 二维数组 遍历      更新时间:2023-10-16

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

它有助于简化问题,使其仅依赖于单个值(而不是相邻值对(。 因此,将网格与每个完美的棋盘格进行XOR操作

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

现在的目标是在任何一个网格中找到不超过K_i0 的最大正方形(显然赞成这里的左边(。

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

要泛化为K_i>0,请为每个单元格存储每个翻转次数的这三个值(行长、列长度和正方形大小(,最多K_i次。 具有 1 的单元格像以前一样将每行/列长度添加到 1,而具有 0 的单元格将这些长度移动到下一个翻转计数,丢弃那些翻转计数现在太大的单元格,并为 0 次翻转添加新0。 对于行长东、列长南和正方形大小东南的每个组合,每个组合都有一个翻转计数,单元格将获得一个候选正方形大小,该大小是其最小值及其翻转计数之和,如果单元格本身为 0,则加 1。 对于每个翻转计数(不要太大(,请保留最大的正方形大小,注意它是否是迄今为止遇到的最大(对于该翻转计数(。

请注意,当方块比数组小得多时,蛮力解决方案可能几乎一样快,因为它只需要访问每个方块的少量次数。