Как добавить числа в матрице для достижения минимального результата?

Это скорее алгоритмическая/математическая проблема, но я надеюсь реализовать решение на С++.

Предположим, что у меня есть такая матрица, где точки представляют целые числа:

   W  X  Y  Z
A  .  .  .  . 
B  .  .  .  .
C  .  .  .  .
D  .  .  .  .

Как бы я дал минимальный результат, если мне нужно было выбрать один номер из каждого столбца, чтобы было не более одного номера из каждой строки?

Например, я мог бы выбрать AW BX CY DZ или AZ BX CY DW, но NOT AW BW CZ DZ

Подход грубой силы, казалось бы, займет n! расчеты. Есть ли более быстрый путь? В конце концов я хотел бы добавить числа в матрицах размером ~ 60.

Кроме того, все числа варьируются от 0 до 256.

Ответ 1

И если вы предпочитаете не кодировать его самостоятельно, вы всегда можете использовать чужую "трудолюбие" и "печатную публикацию". Этот в Haskell решает 60x60 случайную матрицу менее чем за две десятых доли секунды на моем старом ноутбуке. Какой отличный алгоритм!

import Data.Algorithm.Munkres
import Data.Array.Unboxed
import Data.List (transpose)

solve n matrix = 
  hungarianMethodInt (listArray ((1,1),(n,n)) $ concat $ transpose matrix)