c++ - 遍历二维数组的所有子数组

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

我有一个大小为 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] 中。 我在实现这个时遇到了问题,因为我不知道如何遍历给定索引的所有子数组。我已经尝试了很长时间,但仍然没有实现。有人可以帮忙吗?

最佳答案

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

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

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

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

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

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

关于c++ - 遍历二维数组的所有子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52791850/

相关文章:

c++ - 自下而上的方法来找零硬币的最小数量

c++ - Lambda 成员函数

javascript - 在运行时问题将 JSON 对象添加到 JSON 数组

c - strtok 的奇怪输出

Javascript:调用函数onsubmit不拦截参数

c# - 将 StringBuilder 传递给需要 char 指针的 DLL 函数

c++ - 错误 LNK2005 : "int __cdecl number(void)" (? number@@YAHXZ) 已经在 functions.obj 中定义

loops - 双循环函数的时间复合体

python - 如何使用 python 在循环中有效地调用函数?

c# - 使用多个 IF 构建 FOR 循环并使其仅在某些运行中停止