diff options
| author | Charles <sircharlesaze@gmail.com> | 2019-08-18 16:20:54 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2019-08-18 16:20:54 +0200 |
| commit | 5f0ae4934ddec8ecab663e5702e1c0c4b1c50b6f (patch) | |
| tree | 62dc51eb2f52080da0ad704aa5da3ac5eaeadbb5 /haskell | |
| parent | 3b6b65b08b16cde07a4d8870e829a8c4b5e5d773 (diff) | |
| download | project_euler-5f0ae4934ddec8ecab663e5702e1c0c4b1c50b6f.tar.gz project_euler-5f0ae4934ddec8ecab663e5702e1c0c4b1c50b6f.tar.bz2 project_euler-5f0ae4934ddec8ecab663e5702e1c0c4b1c50b6f.zip | |
haskell problem 67
Diffstat (limited to 'haskell')
| -rw-r--r-- | haskell/067-maximum_path_sum_II.hs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/haskell/067-maximum_path_sum_II.hs b/haskell/067-maximum_path_sum_II.hs new file mode 100644 index 0000000..7e27424 --- /dev/null +++ b/haskell/067-maximum_path_sum_II.hs @@ -0,0 +1,38 @@ +-- Maximum path sum II +-- +-- Problem 67 +-- By starting at the top of the triangle below and moving to adjacent +-- numbers on the row below, the maximum total from top to bottom is 23. +-- +-- 3 +-- 7 4 +-- 2 4 6 +-- 8 5 9 3 +-- +-- That is, 3 + 7 + 4 + 9 = 23. +-- +-- Find the maximum total from top to bottom in triangle.txt +-- (right click and 'Save Link/Target As...'), a 15K text file containing a triangle +-- with one-hundred rows. +-- +-- NOTE: This is a much more difficult version of Problem 18. It is not possible to +-- try every route to solve this problem, as there are 299 altogether! If +-- you could check one trillion (1012) routes every second it would take over +-- twenty billion years to check them all. There is an efficient algorithm to solve it. ;o) + + +main = do + content <- readFile "../data/067_triangle.txt" + print (head $ maxPath $ parseTriangle content) + +-- recursion is beautiful (always) +maxPath :: [[Int]] -> [Int] +maxPath [r] = r +maxPath (top : bottom) = zipWith (+) top (maxRow $ maxPath bottom) + +maxRow :: [Int] -> [Int] +maxRow [x] = [] +maxRow r = max (head r) (r !! 1) : maxRow (tail r) + +parseTriangle :: String -> [[Int]] +parseTriangle str = map (\l -> map (\n -> read n :: Int) (words l)) (lines str) |
