Created
October 1, 2010 05:34
-
-
Save oskimura/605792 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Euler18 where | |
import Data.Map hiding (map) | |
import Data.List (scanr) | |
lst :: [[Integer]] | |
lst = [ | |
[75] | |
, [95,64] | |
, [17,47,82] | |
, [18,35,87,10] | |
, [20,04,82,47,65] | |
, [19,01,23,75,03,34] | |
, [88,02,77,73,07,63,67] | |
, [99,65,04,28,06,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,04,68,89,53,67,30,73,16,69,87,40,31] | |
, [04,62,98,27,23,09,70,98,73,93,38,53,60,04,23] | |
] | |
table = fromList $ lst2 | |
where | |
lst2 = concat $ map (\x-> zipWith (\a b ->((fromIntegral (length x) , a),b)) [1..] x) lst | |
euler18 = foldr1 max (f 1 1 0) | |
where | |
bound = 15 | |
f n m s | |
| n == bound = [sum'] | |
| otherwise = (f (n+1) m sum') | |
++ (f (n+1) (m+1) sum') | |
where | |
sum' = table!(n,m) + s | |
NG コード
g xs | (length xs) >= n = take n xs : g (drop n xs)
| otherwise = [xs]
where n = 15
z n m
| n == bound = [(n,m)]
| otherwise = ((n,m):(z (n+1) m)) ++ ((n,m):(z (n+1) (m+1)))
where
bound = 15
動的計画法使うかと思ったけど、全然使わなかった
これって結局二分木の探索みたいな感じだた
このコードはエレガントで素晴らしい
http://tsumuji.cocolog-nifty.com/tsumuji/2010/04/project-euler-.html
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
そんな答えで大丈夫か?