【问题标题】:Cutting board algo切菜板算法
【发布时间】:2019-02-24 17:23:57
【问题描述】:

我有一块 MxN 尺寸的矩形板,需要切成 1x1 大小的正方形。这些方格中的每一个都有一些价值,切割成本是切割中涉及的所有方格值的总和。我想找到可能的最低成本。

示例

假设我们有 2x3 棋盘,正方形棋子的值以矩阵形式给出,如下所示:

2 7 5
1 9 5

现在,如果我们首先进行水平切割,成本将为 (2+7+5+1+9+5=29),我们将得到两个较小的反应角板,例如:

2 7 51 9 5

接下来我们切掉 1,9 和 5(成本=1+9+5=15),然后是 2,7 和 5(成本=2+7+5=14)。所以我们有以下板:

2 751 95

在此之后,我们切割 1 和 9(成本=1+9=10),然后切割 2 和 7(成本=2+7=9)。我们还剩下以下正方形:

275195

现在我们将停止,因为所有剩余的部分都只是 1x1。

所以总成本是 77。现在这只是给出最低成本的方法之一。还有其他切割电路板的方法可能会产生相同或更高的成本。

那么,我怎样才能找到最低成本?感谢您的帮助!

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 你能详细说明切割的工作原理吗?
  • @GiorgosMyrianthous 我知道先在哪里切割,就像因为我们正在取所涉及的平方值的总和,因此我们应该首先分离更大的值,这样它们就不会再次相加,但是我不知道如何在任何给定时间跟踪董事会,例如已经进行了哪些削减以及还有哪些工作要做
  • all the squares involved 是指all squares of the current piece of board 吗?那是第一次削减总是会花费董事会所有单元格的总和?
  • @dangee1705 我已经编辑了这个问题,现在这个例子更清楚了

标签: python arrays python-3.x python-2.7


【解决方案1】:

这花了我一段时间才想出来,效率不高,但对于小谜题应该没问题。

class Piece:
    def __init__(self, data, w, h):
        self.data = data
        self.w = w
        self.h = h

    def cut_vertically(self, x):
        a = Piece([v for i, v in enumerate(self.data) if i % self.w <= x], x + 1, self.h)
        b = Piece([v for i, v in enumerate(self.data) if i % self.w > x], self.w - x - 1, self.h)
        s = sum(self.data)
        return a, b, s

    def cut_horizontally(self, y):
        a = Piece([v for i, v in enumerate(self.data) if i < self.w * (y + 1)], self.w, y + 1)
        b = Piece([v for i, v in enumerate(self.data) if i >= self.w * (y + 1)], self.w, self.h - y - 1)
        s = sum(self.data)
        return a, b, s

    def generate_cuts(self):
        for x in range(self.w - 1):
            yield self.cut_vertically(x)
        for y in range(self.h - 1):
            yield self.cut_horizontally(y)

def scores(p):
    if p.w == 1 and p.h == 1:
        yield 0

    for a, b, s in p.generate_cuts():
        for s1 in scores(a):
            for s2 in scores(b):
                yield s + s1 + s2

p = Piece([2, 7, 5, 1, 9, 5], 3, 2)

min_score = None
for score in scores(p):
    if not min_score or score < min_score:
        min_score = score

print(score)

它没有任何错误检查,因此您必须确保您的Piece 设置正确,但我希望它足以满足您的需求。

【讨论】:

    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多