Problem 81

http://projecteuler.net/index.php?section=problems&id=81
ものすごくそのままなDP

import Data.Array.IArray
import Control.Monad

root ::Array (Int,Int) Integer->Array (Int,Int) Integer
root cost = r
    where r = listArray b [c ix | ix <- range b]
          b = bounds cost
          c (i,j) = cost!(i,j) + f [r!ix|ix<-[(i+1,j),(i,j+1)],inRange b ix]
          f [] = 0
          f [a] = a
          f [a,b] = min a b

mkArray ::String->Array (Int,Int) Integer
mkArray ws= listArray ((1,1),(m,m)) ws'
    where ws'=concat.map (read.g).lines$ws
          m = floor.sqrt.fromIntegral.length$ws'
          g x = "["++x++"]"

main = liftM((!(1,1)).root.mkArray).readFile$"matrix.txt"