Максимальное количество индексов с одним и тем же элементом путем объединения строк из заданных матриц

Опубликовано: 21 Сентября, 2022

Имея два двумерных двоичных массива, a[][] и b[][] оба размера M*N , задача состоит в том, чтобы соединить каждую строку в массиве a[][] с любой строкой в массиве b[][] таким образом, что общий балл может быть максимальным, а балл для каждой пары рассчитывается как сумма индексов, при которых значения обеих строк идентичны.

Примечание. Каждая строка массива b[][] может быть связана только с одной строкой вектора а[][] .

Примеры:

Input: a[][] = {{1, 1, 0}, {1, 0, 1}, {0, 0, 1}}, b[][] = {{1, 0, 0}, {0, 0, 1}, {1, 1, 0}}
Output: 8
Explanation:
Consider the pairing of rows in the following order, to maximize the total score obtained:

  • Row 0 of a[][] paired with row 2 of b[][] has the score of 3.
  • Row 1 of a[][] paired with row 0 of b[][] with score of 2.
  • Row 2 of a[][] paired with row 1 of b[][] with score of 3.

Therefore, the sum of scores obtained is 3 + 2 + 3 = 8.

Input: a[][] = {{0, 0}, {0, 0}, {0, 0}}, b[][] = {{1, 1}, {1, 1}, {1, 1}}
Output: 0

Наивный подход: самый простой подход к решению данной проблемы состоит в том, чтобы сгенерировать все возможные перестановки строк массивов a[][] и для каждой перестановки массива a[][] найти сумму баллов каждой соответствующей пары , и если он больше, чем текущий ответ , обновить ответ до значения текущей суммы баллов. После проверки всех пар выведите максимальное количество баллов.

Ниже приведена реализация вышеуказанного подхода:


Временная сложность: O(N*M*M!), где M! - количество перестановок и N * M для расчета оценки каждой пары.
Вспомогательное пространство: O(M)

Эффективный подход. Описанный выше подход также можно оптимизировать с помощью концепции битовой маскировки. Идея состоит в том, чтобы для каждой строки в векторе a[][] попробовать все строки в векторе b[][] , которые не были выбраны ранее. Используйте битовую маску для представления уже выбранных строк вектора b[][] . Чтобы избежать повторного вычисления одной и той же подзадачи, запомните результат для каждой битовой маски. Выполните следующие шаги, чтобы решить проблему:

  • Инициализируйте строку переменных как 0, замаскируйте как (2 M – 1) .
  • Инициализируйте вектор dp[] размера mask + 1 со значениями -1 .
  • Если строка больше, чем равна a.size() , верните 0 , а если dp[mask] не равно -1 , верните dp[mask] .
  • Инициализируйте переменную ans как 0 , чтобы сохранить ответ.
  • Перебрать диапазон [0, a.size()) с помощью переменной i и выполнить следующие задачи:
    • Если побитовое И маски и 2 i истинно , тогда инициализируйте переменную newMask как mask^(1<<i) и curSum как 0 .
    • Переберите диапазон [0, a[i].size()) с использованием переменной j , и если a[row][j] равно b[i][j] , увеличьте значение curSum на 1 .
    • Установите значение ans как максимальное значение ans или curSum + maxScoreSum(a, b, row+1, newmask, dp) рекурсивно.
  • После выполнения вышеуказанных шагов установите значение dp[mask] в качестве ответа и верните значение ответа в качестве ответа.

Ниже приведена реализация вышеуказанного подхода:


Временная сложность: O(2 M *M*N)
Вспомогательное пространство: O(2 м )