在K切割后最小化最大组的大小

时间:2016-02-29 06:47:12

标签: algorithm bit-manipulation computational-geometry graph-theory plane

  

考虑允许切割的N×N平方的整数   垂直或水平K次。你想尽量减少   切割后每个结果盒中的最大总和。打印出这笔最大的金额。

  

奖励:打印出最低总和的切割排列。

  

提示:使用位操作

例如,假设允许2次切割且网格为

1 0 1 4
1 0 1 0
1 2 1 4

通过切割它:

1 0 1 | 4
1 0 1 | 0
---------
1 2 1 | 4

您可以最小化四个象限中的任何一个的最大总和,然后打印出4。

我注意到的第一件事是,在最多K次切割的情况下,使用所有K切割对您有利。

我想到的一件事是二元搜索切割位置以最小化每个左/右半部分的总和然后二元搜索顶部/底部,但是如何将其扩展到超过2个切割?

位操作的暗示也让我认为使用位掩码的动态编程是预期的解决方案。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

一个观察结果是,切割的顺序不会影响最终结果。

因此,使用位掩码,我们可以检查水平和垂直切割的每个组合。

假设我们有一个N-1位的数字,表示所有水平切割,如果位置ith的位是1,那么,这也意味着我们在行{{ 1}}和ith

同样,我们可以用一个数字来表示所有垂直切割。从这两个数字中,我们可以计算出这些切割所定义的每个区域的最大总和。

代码来说明我的解决方案。

i + 1