[Haskell-beginners] Dynamic Programming in Haskell
Ali Razavi
ali.razavi at gmail.com
Tue Jul 6 12:45:47 EDT 2010
In order to practice Haskell, I decided to program some algorithms from the
CLRS book. Particularly, I tried to implement the Matrix Chain Order from
Chapter 15 on Dynamic Programming.
Here is my code. It seems to work, however, it looks ugly and it was a
nightmare to debug. I appreciate comments about a more elegant solution, and
generally the best way to implement these kinds of algorithms in Haskell.
Style improvement suggestions are also welcome.
Best,
Ali
import Data.Array
pp = [30,35,15,5,10,20,25]
para p = let n = length p - 1
msij = array ((1,1),(n,n))
([((i,j), (0,0)) | i <-[1..n], j <-[1..n]] ++
[((i,j), (m, s))| l<-[2..n]
, i<-[1..n-l+1]
, let j = i + l - 1
, let qs =
[q|k<-[i..j-1]
, let q =
fst (msij!(i,k)) + fst (msij!(k+1, j)) + p!!(i-1)*p!!k*p!!j]
, let (m, s, c) =
foldl (\(mz,sz,ind) x-> if x < mz then (x,ind,ind+1) else (mz,sz,ind+1))
(head qs, i, i) qs ])
in msij
chainSolve p = let sol = para p
n = length p - 1 in
do
print $ fst $ sol!(1,n)
putStrLn $ printSol sol 1 n ""
where
printSol s i j o =
if i == j then
o ++ "A" ++ (show i)
else
o ++ "(" ++
(printSol s i (snd (s!(i,j))) o) ++
(printSol s ((snd (s!(i,j)))+1) j o) ++ ")"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20100706/ab16e5f5/attachment.html
More information about the Beginners
mailing list