遍历二维数组的所有子数组
Traversing all the subarrays of a 2-D 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,我们可以将数组索引 (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。 对于每个翻转计数(不要太大(,请保留最大的正方形大小,注意它是否是迄今为止遇到的最大(对于该翻转计数(。
请注意,当方块比数组小得多时,蛮力解决方案可能几乎一样快,因为它只需要访问每个方块的少量次数。
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用用户输入变量制作二维数组?
- C++ 中动态二维数组的访问冲突
- 遍历二维数组的所有子数组
- 将二维数组的所有元素插入到一维数组中
- 在函数中传递二维数组
- 为什么指针在对二维数组进行排序时无法正常工作?
- 创建 std::string 的二维数组的最佳做法
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 元素在二维数组 c++ 中的出现次数
- 执行 c++ 二维数组
- C++ 中的二维数组初始化为一个值
- 二维数组:二维数组的子平方的元素之和
- Cplusplus std::一组二维数组