Минимизация размера наибольшей группы после K сокращений

Рассмотрим квадрат N x 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 разрезов?

Намек на манипулирование битами также заставляет меня думать, что некоторое динамическое программирование с использованием битовых масок является предполагаемым решением.

Есть идеи?


person 1110101001    schedule 29.02.2016    source источник
comment
@PhamTrung N ‹= 15 и K ‹= N, поэтому я предполагаю, что даже грубая сила может сработать   -  person 1110101001    schedule 01.03.2016


Ответы (1)


Одно наблюдение состоит в том, что порядок разреза не влияет на конечный результат.

Итак, используя битовую маску, мы можем проверить каждую комбинацию горизонтальных и вертикальных разрезов.

Предположим, что у нас есть число с N - 1 битами, представленными для всех горизонтальных разрезов, и, если бит в позиции ith равен единице, то это также означает, что мы сделали разрез между строками ith и i + 1th.

Точно так же у нас может быть число для представления всех вертикальных разрезов. Из этих двух чисел мы можем вычислить максимальную сумму каждой площади, определяемой этими разрезами.

Код для иллюстрации моего решения.

for(int i = 0; i< (1<< (N - 1)); i++)
  for(int j = 0; j < (1 << (N - 1)); j++)
      if(number of bit set i + j == k)
         calculate the maximum sum;
person Pham Trung    schedule 29.02.2016
comment
Я предполагаю, что для расчета суммы в каждом регионе на основе разрезов вы предварительно обработаете матрицу, используя структуру данных, позволяющую выполнять запросы 2D-диапазона? - person 1110101001; 01.03.2016
comment
@1110101001 Поскольку N ‹= 15 и K ‹= N, это не сработает, 2^30 слишком велико для этого. Грамотное использование условия (i + j == k) может уменьшить временную сложность до C(2n, n), что все еще слишком велико. Я подумаю, как это улучшить. - person Pham Trung; 01.03.2016