Matrix chain multiplication: Difference between revisions

→‎{{header|Haskell}}: Suggested edit (OP may prefer to revert): applied hlint hindent, specified imports
(→‎{{header|Haskell}}: Suggested edit (OP may prefer to revert): applied hlint hindent, specified imports)
Line 374:
 
=={{header|Haskell}}==
<lang Haskell>import Data.Maybe (fromJust)
import Data.List (elemIndex)
import Data.Char (chr, ord)
import Data.Maybe
 
mats =:: [[5, 6, 3, 1Int]],
mats =
[1, 5, 25, 30, 100, 70, 2, 1, 100, 250, 1, 1000, 2],
[ [10005, 16, 500, 123, 1, 700, 2500, 3, 2, 5, 14, 10]]
, [1, 5, 25, 30, 100, 70, 2, 1, 100, 250, 1, 1000, 2],
, [1000, 1, 500, 12, 1, 700, 2500, 3, 2, 5, 14, 10]
]
 
cost a:: i[Int] j-> =Int if-> Int -> (iInt, < jInt) then
cost a i j
let m = [fst (cost a i k) + fst (cost a (k+1) j) + (a!!i) * (a!!(j+1)) * (a!!(k+1)) | k <- [i..j-1] ] in
| i < j =
let mm = minimum m in (mm, (fromJust $ elemIndex mm m) + i)
let m else (0, -1)=
let m = [ fst (cost a i k) + fst (cost a (k+1) j) + (a!!i1) * (a!!(j+1)) * (a!!(k+1)) | k <- [i..j-1] ] in
(a !! i) * (a !! (j + 1)) * (a !! (k + 1))
| k <- [i .. j - 1] ]
in let mm = minimum m
let mm = minimum m in (mm, (fromJust $ (elemIndex mm m) + i)
| otherwise = (0, -1)
 
optimalOrder a:: i[Int] j-> =Int if-> (iInt <-> j) thenString
optimalOrder a i j
let c = cost a i j in "(" ++ (optimalOrder a i (snd c)) ++ (optimalOrder a ((snd c) + 1) j) ++ ")"
| else [chr((+i) $ ord< 'a')]j =
let c = cost a i j
let c = cost a i j in "(" ++ (optimalOrder a i (snd c)) ++ (optimalOrder a ((snd c) + 1) j) ++ ")"
| otherwise = [chr ((+ i) $ ord 'a')]
 
printBlock v:: =[Int] let-> c = cost v 0IO (length v - 2) in
printBlock v =
putStrLn ("for " ++ (show $ v) ++ " we have " ++ (show $ (fst c)) ++ " possibilities, z.B " ++
let c (optimalOrder= cost v 0 (length v - 2)))
in putStrLn
("for " ++
show v ++
" we have " ++
show (fst c) ++
" possibilities, z.B " ++ optimalOrder v 0 (length v - 2))
 
main =:: mapM_IO printBlock mats()
main = mapM_ printBlock mats</lang>
</lang>
{{out}}
<pre>for [5,6,3,1] we have 48 possibilities, z.B (a(bc))
<pre>
for [5,6,3,1] we have 48 possibilities, z.B (a(bc))
for [1,5,25,30,100,70,2,1,100,250,1,1000,2] we have 38120 possibilities, z.B ((((((((ab)c)d)e)f)g)(h(ij)))(kl))
for [1000,1,500,12,1,700,2500,3,2,5,14,10] we have 1773740 possibilities, z.B (a((((((bc)d)(((ef)g)h))i)j)k))</pre>
</pre>
 
=={{header|Julia}}==
9,655

edits