[Haskell-beginners] How to improve performace of a dfs program

xiong.hua ivoryxiong at gmail.com
Tue Jun 5 15:33:26 CEST 2012


hi ,all :

   I'm a learn haskell couple of days , and I want to solve some problem
[http://codeforces.com/contest/194/problem/D] with haskell , I know the
algorithm for the problem and implement it with haskell , but i jsut get TLE
on the test case . Here is my code , how i can implement it more Efficient ?

 

code : 

import Data.Bits

import Data.Int

--import Debug.Trace

 

calc :: [Int64] -> [Int64] -> Int64

calc a b = sum $ zipWith (*) a b

 

 

-- a p r

fun2op :: [Int64] -> [Int] -> Int64 -> [Int64]

--fun2op a x r |

--   trace ("fun2op " ++ show a ++ " " ++ show x ++ " " ++ show r ) False =
undefined

fun2op _ [] _ = []

fun2op a (x:xs) r = (( a !! (x-1)) + r) : (fun2op a xs r )

 

gor :: [Int64] -> [Int64] -> Int -> Int -> Int64 -> Int64

gor a k dep u ans

         | (  ( u - dep ) .&.  1 :: Int) == 0 = max ans $ calc a k

         | otherwise = ans   

 

-- a , b , p , k  , r , u , last , dep , ans

dfs :: [Int64] -> [Int64] -> [Int] -> [Int64] -> Int64 -> Int -> Int -> Int
-> Int64 -> Int64

 

dfs a b p k r u l dep ans

--    | trace ("dfs " ++ show a ++ " " ++ show l ++ " " ++  show dep ++ " "
++ show ans) False = undefined

    | dep == u = max ans $ calc a k 

    | l == 1  = df1

    | otherwise  = max (df1) ( dfs (zipWith ( xor ) a b ) b p k r u 1
(dep+1) tmpans)

    where

        pa = fun2op a p r

        tmpans = gor a k dep u ans

        df1 = dfs pa b p k r u 2 (dep + 1) tmpans

 

 

rInt64 :: String -> Int64

rInt64 = read

 

rInt :: String -> Int

rInt = read

 

main = do

    ss <- getLine

    let tmp = words ss

    let u = rInt (tmp !! 1)

    let r = rInt64 ( tmp !! 2)

    let x = map (rInt) $ words ss

    let x = map (rInt) $ words ss

    aa <- getLine

    let a = map (rInt64) $ words aa

    bb <- getLine

    let b = map (rInt64) $ words bb

    kk <- getLine

    let k = map (rInt64) $ words kk

    pp <- getLine

    let p = map (rInt) $ words pp

    print ( dfs a b p k r u 0 0 (rInt64 "-1000000000000000000"))

 

--------------

Best Regards

GTALK: ivoryxiong AT gmail.com

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20120605/d4f6dd8a/attachment-0001.htm>


More information about the Beginners mailing list