Matrix中的最小拆分数

时间:2014-07-19 16:19:58

标签: java c algorithm data-structures dynamic-programming

有一个矩形的纸张,其中包含宽x高的方形瓷砖。通过从边缘水平或垂直分割,可将片材分成两个矩形片段。

例如,2x2纸张可以分为两个2x1纸张,但不能分为两个部分,其中一个是1x1。可以根据需要将工作表分成多次。

我想创建至少一件由T瓷砖组成的零件。如何找到实现这一目标所需的最小分割操作次数?

离。 if,width = 5,height = 4,T = 8,    然后       最小分裂数=?
第一次分割将有2件:2x4,3x4。  2x4 = 8等于T.因此分钟。分裂数= 1。

我有强力解决方案,通过它我可以找到在一张纸上获得T个瓷砖所需的最小分割数,但我正在寻找优化的一个。有任何帮助或建议吗?

1 个答案:

答案 0 :(得分:2)

设n和m为板的宽度和高度。

  1. 如果T> n * m显然不可能实现所需的分割。

  2. 如果n或m除以T,那么我们可以轻松地进行一次拆分。注意,也只有一个分裂足够的情况是当T可以被n或m分割时。此外,还有一个特殊情况 - 当T = n * m时,我们不必进行任何分割。

  3. 在其他情况下,如2.中所述,我们必须使至少两个分裂。看看如果对于某些a&lt; = n且b <= m,则T = a * b,那么我们可以进行一次分割以获得大小为a x m的矩形,然后进行另一次分割以获得x b。所以现在我们必须迭代所有可能的对(a,b),使得T = a * b。如果其中有一对矩形a x b可以放在大小为n x m的板中,那么我们可以回答答案是两个分裂。如果没有找到这样的对,那么会发生什么,即T是一个大的素数,那么分裂是不可能的,如案例1所示。

  4. 在某些情况下(即1.和2.)解决方案的复杂性是O(1),但在一般情况下(3.)它是O(sqrt T),就像我们检查所有对(a,b)a * b = T然后MIN(a,b)&lt; = sqrt(T) - 它是搜索某些数的除数时常用的技巧。