2013-07-03 10 views
10

Jest to bardziej problem algorytmiczny/matematyczny, ale mam nadzieję, że zaimplementuję rozwiązanie w C++.Jak dodać liczby w macierzy, aby uzyskać minimalny wynik?

Załóżmy, że ma matrycę, jak następuje, gdy kropki oznaczają liczby całkowite:

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

Jak poddaję minimalny efekt jeśli było wybrać jeden numer z każdej kolumnie tak, że przynajmniej jedna liczba od każdy rząd?

Na przykład, mogę wybrać AW BX CY DZ lub AZ BX CY DW ale NIE AW BW CZ DZ

Podejście brute force wydaje się brać n! obliczenia. Czy jest szybsza droga? Ostatecznie chciałbym dodać liczby w macierzach o rozmiarze ~ 60.

Ponadto, wszystkie liczby w zakresie od 0 do 256.

+0

n silnia rzeczywiście. mój błąd. – Tarik

+1

Załóżmy, że zaczynasz od AW, BX lub BW, AX: W obu przypadkach wypadałyby kolumny A, B i W, X. Myślenie w tym kierunku rekursywnie i buforowanie wyników powinno załatwić sprawę. Zobacz http://en.wikipedia.org/wiki/Dynamic_programming – Tarik

+9

http://en.wikipedia.org/wiki/Hungarian_algorithm Twoje pytanie wygląda podobnie do tego problemu. – user2548103

Odpowiedz

1

A jeśli nie chcesz kodować go samodzielnie, zawsze można użyć kogoś innego twardego pracy i rodzaju publikacji. Ten w Haskell rozwiązuje losową matrycę 60x60 w mniej niż dwie dziesiąte sekundy na moim starym laptopie. Co za świetny algorytm!

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

solve n matrix = 
    hungarianMethodInt (listArray ((1,1),(n,n)) $ concat $ transpose matrix) 
Powiązane problemy