Ho tre funzioni che agiscono su una matrice e il tipo di trovare un percorso di somma minimo (Nota dim
= 80, vedi link ):
-- f is the minimum cost from x, y by taking only up and right (up and down doesn't make sense)
f :: [[Int]] -> Int -> Int -> Int
f arr x y
| y == dim-1 = arr !! x !! y
| otherwise = arr !! x !! y + if x > 0 then min (h arr x (y+1)) (f arr (x-1) y) else h arr x (y+1)
-- g is the minimum cost from x, y by taking only down and right (up and down doesn't make sense)
g :: [[Int]] -> Int -> Int -> Int
g arr x y
| y == dim-1 = arr !! x !! y
| otherwise = arr !! x !! y + if x + 1 < dim then min (h arr x (y+1)) (g arr (x+1) y) else h arr x (y+1)
-- h is the minimum cost from x, y by taking both up, down and right
h :: [[Int]] -> Int -> Int -> Int
h arr x y
| y == dim-1 = arr !! x !! y
| otherwise = min (g arr x y) (f arr x y)
Ho provato a usare Data.Function.Memoize
ma anche questo non funzionava (credo fermamente che stia facendo qualcosa di sbagliato), cioè stavo facendo memoF = memoize f
e così via e sostituendo le chiamate a f
, g
e h
con memoF
e così via.
Ho finalmente bisogno di trovare minimum [h arr x 0 | x <- [0..dim-1]]
.
Cosa dovrei fare?