Нахождение максимальной суммы из матрицы

#algorithm

#алгоритм

Вопрос:

Существует матрица с m строками и n столбцами. Задача состоит в том, чтобы найти максимальную сумму, выбирая один элемент из каждой строки и столбца. Я придумал решение, которое находит максимум из всей матрицы, а затем устанавливает эту строку и столбец равными нулю, добавляет их к сумме и переходит к поиску следующего максимума. Это повторяется m раз.

Но проблема с этим подходом заключалась в наличии повторяющихся элементов. Я попытаюсь объяснить это на примере. Вот матрица..

3 6 5 3

9 4 9 2
8 1 4 3

4 7 2 5

Теперь, если я последую приведенному выше методу .. сумма будет 9 7 5 3 в то время как это должно быть 9 8 7 3 . Как решить эту проблему.. Я застрял

Обновление: столбцы — это стоимость мест, которые могут быть назначены человеку, а строки — количество человек. Мы хотим назначить их таким образом, чтобы получить максимальную стоимость.

Комментарии:

1. Ваша процедура должна повторяться min{m,n} несколько раз, но на самом деле это все равно не исправит.

2. Попробуйте подход DP: MRC(M, R, C) = max_(i,j)inRxC ( MRC(M, R{i},C{j}) Mij )

3. Ваш алгоритм не будет работать для следующего примера: {{3,2},{2,0}} .

4. @davin — Я не понимаю, не могли бы вы рассказать немного подробнее.

5. @FelixCQ — Обнаружил это после того, как Петар указал на это. Но спасибо за другой пример 🙂

Ответ №1:

Разве это не просто http://en.wikipedia.org/wiki/Assignment_problem , обычно решаемая с помощью http://en.wikipedia.org/wiki/Hungarian_algorithm ? Очевидно, что вам нужен максимум, а не минимум, но, безусловно, вы можете достичь этого, максимизируя затраты, которые составляют — (реальная стоимость) или, если вас беспокоит -пять затрат, (максимальная стоимость в матрице) — (реальная стоимость).

Комментарии:

1. Вау .. я думаю, что венгерский алгоритм должен работать с небольшой модификацией. Спасибо @mcdowella.

Ответ №2:

Ваш алгоритм неверен — рассмотрите небольшое изменение в матрице, где вторые 9 равны 8:

 3 6 5 3 
9 4 8 2 
8 1 4 3 
4 7 2 5 
  

Тогда у вашего алгоритма нет проблем с поиском 9, 7, 5, 3 (нет дубликатов), но правильный ответ все еще 8, 8, 7, 3 остается.

Вы можете применить грубую силу, попробовав все комбинации. Один хороший способ поместить это в код — использовать рекурсивную функцию, которая решает проблему для любой матрицы:

В нем вы должны выполнить итерацию, скажем, по первой строке и вызвать функцию для подматрицы, полученной путем удаления соответствующей строки и столбца. Затем вы должны выбрать наибольшую сумму.

Это, конечно, будет слишком медленно для больших матриц. Сложность заключается O(N!) в том.

Комментарии:

1. Спасибо, Питер, так что у этого алгоритма больше недостатков, чем я думал. O (N!) .. есть ли другой способ?

2. Я уверен, что есть более сложные алгоритмы, которые лучше. В конце концов, грубая сила хуже 🙂

3. Не могли бы вы сказать мне, каким будет алгоритм для грубой силы?