Skip to content

Instantly share code, notes, and snippets.

@fbiville
Last active August 29, 2015 14:13
Show Gist options
  • Save fbiville/af1be0c3af8aaf63e88c to your computer and use it in GitHub Desktop.
Save fbiville/af1be0c3af8aaf63e88c to your computer and use it in GitHub Desktop.
main :: IO ()
main = print $ maximum_path_sum [[75],[95,64],[17,47,82],[18,35,87,10],[20,4,82,47,65],[19,1,23,75,3,34],[88,2,77,73,7,63,67],[99,65,4,28,6,16,70,92],[41,41,26,56,83,40,80,70,33],[41,48,72,33,47,32,37,16,94,29],[53,71,44,65,25,43,91,52,97,51,14],[70,11,33,28,77,73,17,78,39,68,17,57],[91,71,52,38,17,14,91,43,58,50,27,29,48],[63,66,4,68,89,53,67,30,73,16,69,87,40,31],[4,62,98,27,23,9,70,98,73,93,38,53,60,4,23]]
maximum_path_sum :: [[Int]] -> Int
maximum_path_sum = sum . (maximum_path [] (0,0))
maximum_path :: [Int] -> (Int,Int) -> [[Int]] -> [Int]
maximum_path acc i@(x,y) paths
| x == (length paths)-1 = acc'
| otherwise = maximum_path acc' i' paths
where acc' = (paths !! x !! y):acc
i' = (next_coordinates i paths)
next_coordinates :: (Int,Int) -> [[Int]] -> (Int,Int)
next_coordinates coord mat
| below >= below_next = (i+1,j)
| otherwise = (i+1,j+1)
where below = (mat !! (i+1) !! j)
below_next = (mat !! (i+1) !! (j+1))
i = fst coord
j = snd coord
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment