考虑允许切割的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个切割?
位操作的暗示也让我认为使用位掩码的动态编程是预期的解决方案。
有什么想法吗?
答案 0 :(得分:1)
一个观察结果是,切割的顺序不会影响最终结果。
因此,使用位掩码,我们可以检查水平和垂直切割的每个组合。
假设我们有一个N-1位的数字,表示所有水平切割,如果位置ith
的位是1,那么,这也意味着我们在行{{ 1}}和ith
。
同样,我们可以用一个数字来表示所有垂直切割。从这两个数字中,我们可以计算出这些切割所定义的每个区域的最大总和。
代码来说明我的解决方案。
i + 1