Решение проблемы «Минимального скалярного продукта» Google Code Jam в Haskell

Готовясь к предстоящему Google Code Jam, я начал работать над некоторыми проблемами. Вот одна из практических задач, которую я попробовал:

http://code.google.com/codejam/contest/32016/dashboard#s=p0

И вот суть моего текущего решения Haskell:

{-
- Problem URL: http://code.google.com/codejam/contest/32016/dashboard#s=p0
-
- solve takes as input a list of strings for a particular case
- and returns a string representation of its solution.
-}

import Data.List    

solve :: [String] -> String
solve input = show $ minimum options
    where (l1:l2:l3:_) = input
          n = read l1 :: Int
          v1 = parseVector l2 n
          v2 = parseVector l3 n
          pairs = [(a,b) | a <- permutations v1, b <- permutations v2]
          options = map scalar pairs

parseVector :: String -> Int -> [Int]
parseVector line n = map read $ take n $ (words line) :: [Int]

scalar :: ([Int],[Int]) -> Int
scalar (v1,v2) = sum $ zipWith (*) v1 v2

Это работает с предоставленным образцом входных данных, но умирает на небольшом входе из-за ошибки нехватки памяти. Увеличение максимального размера кучи, по-видимому, ничего не делает, кроме как позволяет ей работать бесконечно.

Мой главный вопрос заключается в том, как оптимизировать это, чтобы оно действительно возвращало решение, кроме передачи флага -O в ghc, что я уже и сделал.

6
задан iCodez 21 January 2015 в 19:59
поделиться