【问题标题】:How to find the highest sum 3x3 grid in a randomly generated 4x4 grid (modulus grid, can wrap around)如何在随机生成的 4x4 网格中找到总和最高的 3x3 网格(模数网格,可以环绕)
【发布时间】:2014-02-05 06:28:06
【问题描述】:

我解决这个问题的方法效率很低。

我的解决方案:我发现,对于 4x4 网格(2d 数组)中的每个值,都以 3x3 网格为中心。然后我对这个网格求和,添加到一个数组中,然后一旦找到每个 3x3 网格,我就会在新数组中找到最大的和。

根据我的教授的说法,这是“我们正在使用的网格大小的一个很好的解决方案”。但是存在一个更有效的解决方案,他给了我提示

提示更有效的解决方案:“一个可能有用的提示:将其视为最大化二维积分,将网格视为(行,列)的函数。”

需要明确的是,我的解决方案得到了充分肯定。我完全不知道如何开始编写更有效的解决方案。

【问题讨论】:

  • 一个想法是首先总结所有 2x2 网格,但我不知道这是否是您的教授所指的改进。
  • 但是最大的 2x2 网格可能不会导致最大的 3x3 网格,难道没有例外吗?
  • 不,总和将用于计算 3x3 网格。但这对于 3x3 可能不是一个非常有用的改进,因为它对于 4x4(这只是它们的 4 个 2x2 的总和)。

标签: java arrays grid integration mathematical-optimization


【解决方案1】:

这是O(N * M)时空NxM网格的通用解决方案。 假设网格的大小为NxM,我们必须找到总和最大的AxB 网格(1 <= A <= N, 1 <= B <= M)。 可以预先计算一个数组sum(x, y) = 索引为1 <= i <= x1 <= j <= y 的所有元素的总和(sum(x, y) = sum(x - 1, y) + sum(x, y - 1) - sum(x - 1, y - 1) + a(x, y),其中a 是初始网格)。 那么对于所有有效的xy,答案都是max(sum(x, y) - sum(x, y - B) - sum(x - A, y) + sum(x - A, y - B))。 该解决方案没有考虑网格可以环绕但可以轻松修复的事实:使用新网格2Nx2M,如下所示:

aa
aa

上面描述的算法找到的这个网格的答案是关于环绕的初始问题的答案。

【讨论】:

  • 这是一个很好的解决方案,虽然交付时难以理解。我最终决定花时间来破译你可能试图传达的内容,是的,这是一个非常好的解决方案,但它不会在 O(NM) 时间内运行。 sum(x, y) 数组的初始计算为 O(N^2 * M^2)。有 NM 个计算,每个计算平均 O(N*M) 项。我的一部分想为独创性+1。由于缺乏清晰度和错误的时间评估,我的一部分想要-1。所以……我还没有投票……还没有。 +1 如果您澄清并纠正...
  • 总和以 O(n*m) 计算。 sum(x, y) = sum(x, y-1) + sum(x-1,y)-sum(x-1, y-1)+ a(x,y)。一个公式。对于固定的 x 和 y,它是在恒定时间内计算的。
  • 我很抱歉。是的。当我完成破译答案时,我忘记了这一点。是的。这确实是一个美丽而优雅的解决方案。我认为如果你清楚地建立组件的定义并描述为什么要采取每个步骤,它可能会更具可读性。现在真的很难读。无论如何都要 +1,因为太棒了。
  • 另外,我认为这正是教授暗示的意图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 2011-11-26
相关资源
最近更新 更多